ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » Oracle专题深入讨论 » 一直有个疑问,也一直没做试验,希望和大家一起讨论。。。

标题: [原创] 一直有个疑问,也一直没做试验,希望和大家一起讨论。。。
在线/呼叫 sqysl
孤独剑客



来自 山东
精华贴数 0
个人空间 0
技术积分 1268 (1376)
社区积分 31 (6200)
注册日期 2006-12-20
论坛徽章:0
      
      

发表于 2008-5-22 16:57 
一直有个疑问,也一直没做试验,希望和大家一起讨论。。。

问题是:delete from test where 1=2这个语句会在回滚段里分配一个事务槽吗?会在数据段里或数据段里的块上分配信息吗?如果只修改了块的头信息,象:ITL,块的版本号怎末发生变化?存在只修改块头信息而不修改块里数据的情况呢?一起讨论。


__________________
曾经沧海难为水,除却巫山不是云。
天若有情天亦老,人间正道是沧桑。
只看该作者    顶部
离线 Yong Huang
版主



精华贴数 2
个人空间 0
技术积分 4178 (340)
社区积分 129 (3006)
注册日期 2001-10-9
论坛徽章:6
现任管理团队成员ITPUB元老管理团队2006纪念徽章会员2006贡献徽章授权会员2008年新春纪念徽章
      

发表于 2008-5-23 01:54 
No. It does not. Oracle knows you're not getting any rows.

Yong Huang


只看该作者    顶部
在线/呼叫 sqysl
孤独剑客



来自 山东
精华贴数 0
个人空间 0
技术积分 1268 (1376)
社区积分 31 (6200)
注册日期 2006-12-20
论坛徽章:0
      
      

发表于 2008-5-23 07:54 
thanks for reply,yong huang


__________________
曾经沧海难为水,除却巫山不是云。
天若有情天亦老,人间正道是沧桑。
只看该作者    顶部
离线 *迎风*



精华贴数 0
个人空间 0
技术积分 246 (7843)
社区积分 135 (2950)
注册日期 2002-7-8
论坛徽章:0
      
      

发表于 2008-5-23 13:39 
to Yong Huang
How to oracle know it not getting any rows?


只看该作者    顶部
离线 晶晶小妹
月是上弦


精华贴数 3
个人空间 6470
技术积分 1845 (885)
社区积分 9 (11713)
注册日期 2008-2-15
论坛徽章:2
现任管理团队成员数据库板块每日发贴之星    
      

发表于 2008-5-23 15:30 
一个简单的实验即要证明此点:
sid=39 pid=17> delete gk where 0=1;

已删除0行。

sid=43 pid=21> select * from v$transaction;

未选定行

v$transaction视图没有任何行,也就是ORACLE不认为这是一个事务的开始。
我的测试环境是10g


__________________
没有必胜的秘籍,没有方程式遵循
要赢~只有全身心的投入!



为了方便大家查阅,所有的文章都已转入空间

http://space.itpub.net/?13095417

请大家多多支持!
只看该作者    顶部
离线 Toms_zhang
会员


精华贴数 1
个人空间 0
技术积分 16893 (59)
社区积分 2046 (592)
注册日期 2002-8-31
论坛徽章:46
现任管理团队成员管理团队2007贡献徽章会员2007贡献徽章2008年新春纪念徽章ITPUB新首页上线纪念徽章 
      

发表于 2008-5-23 15:48 


QUOTE:
原帖由 晶晶小妹 于 2008-5-23 15:30 发表
一个简单的实验即要证明此点:
sid=39 pid=17> delete gk where 0=1;

已删除0行。

sid=43 pid=21> select * from v$transaction;

未选定行

v$transaction视图没有任何行,也就是ORACLE不认为这是一个事务的开始。
我的测试环境是10g

are you sure?


__________________
托马斯张MSN:toms_zrp@live.cn  我的BLOG:http://tomszrp.itpub.net
只看该作者    顶部
离线 晶晶小妹
月是上弦


精华贴数 3
个人空间 6470
技术积分 1845 (885)
社区积分 9 (11713)
注册日期 2008-2-15
论坛徽章:2
现任管理团队成员数据库板块每日发贴之星    
      

发表于 2008-5-23 16:00 
这个实验是我刚做的。

你是不是说:v$transaction中没有行,并不能说明一个事务没有开始。


__________________
没有必胜的秘籍,没有方程式遵循
要赢~只有全身心的投入!



为了方便大家查阅,所有的文章都已转入空间

http://space.itpub.net/?13095417

请大家多多支持!
只看该作者    顶部
在线/呼叫 sqysl
孤独剑客



来自 山东
精华贴数 0
个人空间 0
技术积分 1268 (1376)
社区积分 31 (6200)
注册日期 2006-12-20
论坛徽章:0
      
      

发表于 2008-5-23 18:19 
以前也和他们讨论过这件事情,我也查了视图资料,V$TRANSACTION,这个视图确实是只显示目前活着的事务,这里没有事务,并不等于一个事务没发生过(V$TRANSACTION lists the active transactions in the system.),你可以查查V$session.TADDR,该字段存储的是事务对象的信息,这个字段在运行了该语句后会产生值的,所以,对这个简单的问题一直比较迷惑,现在谁能把DELETE FROM TEST WHERE 1=2这个语句的内在执行过程清楚的给出就好了,然后可以顺着这个过程做个测试。

[ 本帖最后由 sqysl 于 2008-5-23 18:29 编辑 ]


__________________
曾经沧海难为水,除却巫山不是云。
天若有情天亦老,人间正道是沧桑。
只看该作者    顶部
离线 Yong Huang
版主



精华贴数 2
个人空间 0
技术积分 4178 (340)
社区积分 129 (3006)
注册日期 2001-10-9
论坛徽章:6
现任管理团队成员ITPUB元老管理团队2006纪念徽章会员2006贡献徽章授权会员2008年新春纪念徽章
      

发表于 2008-5-24 01:55 


QUOTE:
原帖由 sqysl 于 2008-5-23 04:19 发表
以前也和他们讨论过这件事情,我也查了视图资料,V$TRANSACTION,这个视图确实是只显示目前活着的事务,这里没有事务,并不等于一个事务没发生过

I see what you mean. To find out what locks have been acquired during a very short period of time (too short for you to check in v$lock), you can use event 10704:

conn username/password
select spid from v$process where addr = (select paddr from v$session where sid in (select sid from v$mystat));
alter session set events '10704 trace name context forever, level 10';
--delete from t where rownum = 1;
delete from t where 1 = 2;
alter session set events '10704 trace name context off';

On my 10.2.0.1 database, I see TM lock taken in mode 3. Apparently it means that even if no row is selected, for a brief period, a mode 3 table lock was taken on that table. But since there's no TX lock, we can safely say no transaction took place. If you change the where to actually delete a row, you *will* see TX in the trace file.

Yong Huang


只看该作者    顶部
在线/呼叫 sqysl
孤独剑客



来自 山东
精华贴数 0
个人空间 0
技术积分 1268 (1376)
社区积分 31 (6200)
注册日期 2006-12-20
论坛徽章:0
      
      

发表于 2008-5-24 20:13 
谢谢yong huang的答复,您说的这些我理解,而且和您有相同的观点,现在关键是有个疑问,那就是ORACLE在开始一个DML语句时,何时获取一个事务槽,无非有以下几种情况:
第一,先不获取事务槽,而是先根据DML对涉及到的数据进行扫描,获取到结果后再获取一个事务槽,然后进行真正的数据操作;关键是这种情况下,如何保证从扫描开始到最后实施真正的修改这段时间里,扫描的数据不被其他事务修改和锁定,TM锁能做到吗?
第二,在开始一个DML时,首先获取一个事务槽,然后对涉及到的数据进行扫描,当对块扫描时,获取一个块ITL,如果这样,无论该块中有没有数据被修改,该事务本身由于获取了ITL,都形成了对该块修改了的事实,即修改了块头;
第三,在开始一个DML时,首先获取一个事务槽,然后对涉及到的数据进行扫描,但在扫描过程中,并不获取ITL,直到扫描某个数据块时,发现该块中有需要加锁修改的数据时,再获取一个块ITL,然后加锁、修改,这种情况下,虽然获取了一个事务槽,但并未修改相应的数据块,不知道这情况算不算获取了一个事务锁。
当然,DELETE FROM TEST WHERE 1=2中的条件ORACLE很容易判断没有符合条件的行,但然过我把WHERE条件换成一个现实的条件,比如:
create table test  as select * from dba_extents;
delete from test where owner='####';
而test表里没有符合owner='####'条件的数据时,上面的问题是个什么情况呢?个人愚见,希望大家共同讨论,共同进步。

[ 本帖最后由 sqysl 于 2008-5-24 20:19 编辑 ]


__________________
曾经沧海难为水,除却巫山不是云。
天若有情天亦老,人间正道是沧桑。
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问