当查询A表的时候,查询还没执行完,为什么能够对表进行删除?

[复制链接]
查看11 | 回复9 | 2013-8-6 15:23:05 | 显示全部楼层 |阅读模式
在Session A中,对X表进行查询。查询没有结束。
在Session B中,竟然能够把X表进行DROP,没想明白。

而且Session A 竟然能继续输出结果。
谁能给解答一下。
[ 本帖最后由 wei-xh 于 2010-4-12 09:32 编辑 ]
回复

使用道具 举报

千问 | 2013-8-6 15:23:05 | 显示全部楼层
哪位大侠解答一下?
回复

使用道具 举报

千问 | 2013-8-6 15:23:05 | 显示全部楼层
应该是你查询的是内存的东西。你删除的是物理上的。
回复

使用道具 举报

千问 | 2013-8-6 15:23:05 | 显示全部楼层
学习一下UNDO,就会明白是怎么会事情了!
回复

使用道具 举报

千问 | 2013-8-6 15:23:05 | 显示全部楼层
query 不会lock表,所以drop 可以work. Drop 只是修改了数据字典,并没有修改segment head 或者表的数据块。Query只用一直读数据就行了。
回复

使用道具 举报

千问 | 2013-8-6 15:23:05 | 显示全部楼层
这就是一致读存在的意义。
要不你查数正High的时候,别人把你的表给删了,你还不得跟他急啊?呵呵。
回复

使用道具 举报

千问 | 2013-8-6 15:23:05 | 显示全部楼层
我在Oracle 10g R1 上测试,如果recyclebin开启,结果如楼主所说。
但如果recyclebin关闭,则drop表时,select语句会立即报错:ORA-08103: 对象不再存在。
如果recyclebin开启,但drop purge,select语句也会立即报ORA-08103。
回复

使用道具 举报

千问 | 2013-8-6 15:23:05 | 显示全部楼层
just try嘿嘿
回复

使用道具 举报

千问 | 2013-8-6 15:23:05 | 显示全部楼层
更正一下,
==》Drop 只是修改了数据字典,并没有修改segment head 或者表的数据块
修改了segment head ,但没有修改数据块。
你可以做一个测试,
create a table tab1
1: open the cursor select * from tab1
2:in another session,drop tab1
3: 回到1的session,fetch the data.
如果tab1的size不大于一个extent,应该可以fetch所有的数据。如果tab1的size大于一个extent,那么当fetch的数据在第二个extent时,fetch的session会试图读segment head,但此时的segment header的extents map的信息已经被抹掉,然后就报错
回复

使用道具 举报

千问 | 2013-8-6 15:23:05 | 显示全部楼层
模拟一下这个过程
sec@ora10g> create table t as select * from all_objects;
Table created.
sec@ora10g> insert into t select * from t;
24560 rows created.
sec@ora10g> /
49120 rows created.
sec@ora10g> /
98240 rows created.
sec@ora10g> /
196480 rows created.
sec@ora10g> /
392960 rows created.
sec@ora10g> /
785920 rows created.
sec@ora10g> commit;
Commit complete.

sec@ora10g> select count(*) from t;
COUNT(*)
----------
1571840

开启第二个session
drop表T
sec@ora10g> drop table t;
Table dropped.
使用v$session_longops查看当前执行的message。
sec@ora10g> select sid,serial#,message,time_remaining
2from v$session_longops
3 where time_remaining > 0
4/

Time
SID SERIAL# MESSAGE
Remaining
------- ------- -------------------------------------------------------------------------------------- ---------
1848 15232 Table Scan:SEC.BIN$hFitti/9oEbgQAB/AQAgDw==$0: 6268 out of 22351 Blocks done
151
读取的就是回收站中的数据。
sec@ora10g> select * from tab;
TNAME
TABTYPECLUSTERID
------------------------------ ------- ----------
BIN$hFitti/9oEbgQAB/AQAgDw==$0 TABLE
sec@ora10g> select OBJECT_NAME,ORIGINAL_NAME,TYPE,OPERATION,DROPTIME from USER_RECYCLEBIN order by DROPTIME,ORIGINAL_NAME;
OBJECT_NAME
ORIGINAL_NAME
TYPE
OPERATION DROPTIME
------------------------------ -------------------------------- -------------------- --------- -------------------
BIN$hFitti/9oEbgQAB/AQAgDw==$0 T
TABLE
DROP2010-04-16:10:00:18
当第一个session执行完之后再重复执行select语句将会报错。
sec@ora10g> select * from t;
select * from t

*
ERROR at line 1:
ORA-00942: table or view does not exist

secooler
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行