关于锁总结杂记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锁来查看子表的内容。
- 关于锁总结杂记2
- 关于锁的总结杂记1
- 关于锁的总结杂记3
- 杂记--关于职业生涯
- 杂记--关于工作
- 杂记--关于XX心
- 杂记--关于逆境
- 杂记--关于野心,挫折
- 关于iCloud 杂记
- 杂记-关于数据库备份
- 关于ios网络杂记
- 关于Android开发杂记
- 关于JNI杂记
- 杂记_一点总结
- javascript总结杂记1
- Java总结杂记
- 杂记2
- 杂记2
- Jboss启动报错
- python 判断变量类型
- Java finally语句到底是在return之前还是之后执行?
- Impala入门笔记
- java随机数
- 关于锁总结杂记2
- 生 气
- 抽象方法和虚方法的区别
- Dynamics CRM小窍门——数据读写锁
- 物理dg failover 后 system01.dbf 不一致
- 黑马程序员--Java基础之面向对象(2)
- C# 多态
- PresentModel UIViewController 的动画方式
- Python多线程学习