关于锁总结杂记2

来源:互联网 发布:c#连接mysql命令 编辑:程序博客网 时间:2024/04/24 13:34

1、锁,与一共享资源(即数据库对象)对应,是后者的一个标记。类似于,购房摇号时,房子与号码的对应。

2、锁类型,分为TX、TM(用于保护表结构)、RLS(即行级锁);

      锁模式,如基本的为S和X(排他锁)。

     不同类型的锁对应加在不同的数据库对象上;

     不同SQL操作语句对应产生锁(如TM)的不同模式。

3、修改操作只能在原版块上,不能在CR块上。

      获得数据块的DBA要由解析SQL语句(share pool)过程完成。

4、latch 是对在内存上的由数据块组成的整个链表加锁进行保护的。

      lock (TX、TM(用于保护表结构)、RLS(即行级锁))是对不同层次的数据库对象的加锁保护。

5、意向锁,就是层次锁(为下一层而在上层加的锁  )

      数据库对象中,行是最下层的,表是它的上一层,所以在表上加意向锁。

      RX:表示表上可以有某几行加上X锁,而表上的其他行没有锁模式的要求,也就是其他行的锁模式为NONE。

      RS:表示表上可以有某几行加上S锁,而表上的其他行没有锁模式的要求,也就是其他行的锁模式为NONE。

     解释Oracle数据库TM的锁模式S和SRX不兼容的原因:

     s即表示表的每行的锁都是为共享锁模式的,而SRX要求除每行为共享锁模式外,部分行可以是排他锁模式的。这样,srx模式下的某些行为排他锁模式,而s模式下又要求的锁这些行都是为共享锁模式的,两者有冲突。

    解释Oracle数据库TM的锁模式RX和SRX不兼容的原因:    

    RX,表示表上可以有某几行加上排他锁模式的锁。但是,若是这几行和srx模式下加上排他锁模式锁的那几行不完全重合,即某一行RX要它加排他锁,SRX要求它加共享锁,两者不兼容就冲突了。即使是重合的那几行,由于 比如 RX加在表的数据行上的是排他锁模式的锁,所以加了该锁后,就不兼容在该行上加上别的锁,故而srx要在该行上加排他锁也是不行的,这种情况下,两者也是不兼容冲突的。

   X模式与任何锁模式不兼容。RX和RX,或者RX和RS兼容。


6、

RX的两种情况:

 1、  lock table table_name in row exclusive mode,该语句表示只是在表上加了RX意向锁,但在行上还没有实际加上锁。

 2、DML语句,如Update table_name …….where  id=1,该语句表示不仅在表上加了RX意向锁,但在id=1的行上还实际加上(X)锁。

 所以,前者与另一个会话的RS或是RX兼容时为Y,后者则为Y*(表示可能成功)。

详见《大话RAC-RAC原理章节》

7、获得各类锁的顺序:事务在开始第一个DML操作时,要先对表加TM锁成功后,才能获得该事务的事务锁。

例如,会话A上,lock table table_name in  exclusive mode。再在会话B上,Update table_name …….where  id=1。之后,用《Oracle多粒度封锁机制研究(一、研究锁机制的开始和基本篇)》里的脚本showalllock.sql查看发现,会话B因为对表加TM锁的模式为none,即没加成功,所以会话B就没有获得该事务的事务锁。


8、事务B在DML过程中发现其所需要的数据行已经被会话A的进程锁定了,之后,用脚本showalllock.sql查看,发现B貌似要获得A的事务锁(或说不是说加在事务上的锁,而是说等待该事务的事务锁的释放。),这个怎么解释?还有TX的S模式咋么理解?什么时候产生呢?

     TX锁保护的对象应该是事务对应的回滚段,就像TM锁保护的对象是表段一样。v$lock视图中的TYPE指的就是区分该锁保护对象的类型;v$locked_object视图中的OBJECT_ID指的就是被锁对象标识。锁保护的对象撤销了,但是锁还在,如TX锁随着事务结束而结束,不是随着rollback to a而结束的。

   《Oracle多粒度封锁机制研究(一、研究锁机制的开始和基本篇)》中的例子外键未加索引引发的锁阻塞,说明

Oracle8中,如果子表的外键上没有加索引,当在父表上删除记录时,会先在子表上申请获得Share锁,之后再在父表上申请Row Exclusive锁。因为父表在删除一行时要看该数据行是否被子表所引用,所以要先在子表上申请获得Share锁来查看子表的内容。