当前位置:Gxlcms > 数据库问题 > ORACLE的TM锁和TX锁

ORACLE的TM锁和TX锁

时间:2021-07-01 10:21:17 帮助过:15人阅读

0:none 
1:null 空 
2:Row-S 行共享(RS):共享表锁,sub share  
3:Row-X 行独占(RX):用于行的修改,sub exclusive  
4:Share 共享锁(S):阻止其他DML操作,share 
5:S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive  
6:exclusive 独占(X):独立访问使用,exclusive

  我们可以从这个表找出至少2个东西,.第一是每种数据库操作都对应的是什么样的锁,第二是每种锁之间,如果遇到之后是否会产生冲突,所谓冲突就是是否会使当前的数据库操作夯住.如果两个操作锁定的是同一行,那么就会有冲突,后操作的会等待前一个操作完成之后再完成,否则会一直夯在那儿;如果不为同一行,那么则不会冲突,后操作的不会等待.举一个例子来说明:假设现在A操作为:对id=1的记录进行update,而B操作为:对id=2的记录进行删除,根据表格说明,在A上操作时在TM级别的锁会是RX,TX级别只有一个是X,在B上会有一个TM级别的锁会是RX,TX级别只有一个X,而根据表格说明,当RX遇到RX的时候,如果2个操作非同一条记录,那么则不会冲突,故AB两个操作均会按照各自的先加一个TM锁,再加一个TX锁,再顺利执行各自的操作,不会夯住。如果将B操作的记录id换位1,那么两个操作记录为同一条记录,在TM锁上会表现出冲突,所以B操作就会等待A操作完成提交后(也就是A的TX锁释放了后),B再相应的生成一个TX锁和一个TM锁再完成操作,否则的话会一直夯住,等待A释放TX锁.

create table CHGRANT_20170327 as select * from CHGRANT;
update CHGRANT_20170327 set UPDATETIME=‘‘ where operno=‘HANA0026‘ and options=‘1‘ and changeid=‘47‘;
select * from v$lock where type in (‘TX‘);

结果如下:

 技术分享

执行UPDATE语句但不提交:

update CHGRANT_20170327 set UPDATETIME=‘‘ where operno=‘HANA0026‘ and options=‘1‘ and changeid=‘47‘;

再看一遍TX锁的情况,结果为:

技术分享

明显多了一个SID为867的锁,查看SID为867的所有的锁:

select * from v$lock where sid in (‘867‘);

结果为:

技术分享

该结果与两个表的数据对应:

1.取TM锁的ID1,查询dba_objects表:

select * from dba_objects where object_id=‘3824866‘;

结果:

技术分享

2.取TX锁的ADDR,查询v$transaction表:

select * from v$transaction;

结果:

技术分享

另开窗口进行delete操作,事务会这被阻塞:

delete from CHGRANT_20170327 where operno=‘HANA0026‘ and options=‘1‘ and changeid=‘47‘;

再次查看TX锁:

select * from v$lock where type in (‘TX‘);

结果:

技术分享

又多出了一个SID为875的锁,查看SID为875的所有锁:

select * from v$lock where sid in (‘875‘);

结果:

技术分享

再返回查看这两个新锁(SID为867和875)的v$lock情况:

select * from v$lock where sid in (‘867‘,‘875‘);

结果:

技术分享

注意SID为867(即update那个操作)的BLOCK变为了‘1‘。

 

现在ROLLBACK那个update操作(867),查看v$lock:

select * from v$lock where sid in (‘867‘,‘875‘);

结果:

技术分享

可见867的锁记录已经被释放掉了。

此时另一窗口的delete操作终于返回了,现在也rollback它。

select * from v$lock where sid in (‘867‘,‘875‘);

结果:

技术分享

两个事务的锁都被释放了。

 

最后补充一个操作,创建索引的时候会生成的锁操作:

创建索引的同时,查询v$lock表

可以发现在创建索引的会生成2个TM锁,锁类别分别为4和3,我们查询这2个TM分别锁定的是什么对象:

根据查询结果发现lmode=4的object_id为55160的对象对应的是TTT这个表,LMODE=4对应的是TM的S锁

 

原文章地址:

http://blog.csdn.net/vertual/article/details/34540555

http://blog.sina.com.cn/s/blog_95b5eb8c0101i22x.html

ORACLE的TM锁和TX锁

标签:div   提交   detail   不同   row   现象   保护   nal   提高   

人气教程排行