在执行包含update,delete,merge,select for update语句时事务必须得到一个TX锁,也就是事务锁。而且会持有这个所直到提交或回滚。事务未提交时,为了实现事务一致性,其它事务不能访问正在修改的数据,其它事务必须排队等待这个事务提交或回滚。下面先介绍排队的实现。
当事务锁住某些数据时,其它事务必须排队等待,ORACLE在SGA中分配的Reource Structure、Lock Structure数据结构通过Enqueue算法实现。
Resource Structure有三个与并发控制有关的成员:Owner,Waiter,Converter。它们其实是指向Lock Structure链表的指针。分别表示已经获取资料访问权的进程、等待进程、锁转换等待进程。资源由ID1,ID2标识,在上图中 TM表示资源类型,256表示dba_objects中的objectid
Lock Structure用于记录访问共享资源的数据结构,它记录了锁模式、进程ID等信息 。当一个进程访问共享资源时,必须要去锁定该资源,所以它先要从内存中申请一个Lock Structure, 然后根据封锁是否成功 加入不同的链表。
行级锁:事务会定位到修改的数据在哪个block,哪个行,然后检查行的LB(Lock Byte锁标识位)
tl: 73 fb: --H-FL-- lb: 0x1 cc: 12 (lb=0x1说明编号0x1的ITL代表的事务锁住本行)锁标识位指向的