您的当前位置:首页正文

事务的事务锁保护的是该事务提交前所有被该事务所操作过的数据行?

2024-11-11 来源:个人技术集锦

一个会话里的当前事务的当前DML操作操作的对象,比如是一数据行。而该数据行已经被另一个会话里的事务所操作过,所以这个另一个会话里的事务的事务锁会锁定保护着该数据行。即使例如在一个事务开始前, savepoint a; 之后进行了对该数据行的操作,最后rollback to a;这样,该数据行上的行级锁已经被撤销了,但是该事务还没有结束,只是他的undo快被撤销了,所以该事务的事务锁还是保护着该数据行。所以,这个一个会话里的当前事务的当前DML操作要操作该数据行,首先必须得到保护该数据行的另一个会话里的事务的那个事务锁,这又是不可能的,因为另一个会话里的事务还没有结束,对应的事务锁没有释放掉。

当另一个会话里的事务结束了,z则对应的事务锁释放掉了。那么,此时,该数据行没有锁保护,这个一个会话里的当前事务对应的事务锁就可以保护它了。


注释:

事务的事务锁保护的是该事务提交前所有被该事务所操作过的数据行。



TX锁称为事务锁或行级锁。

TX锁(事务锁)又被成行级锁

TX锁为什么又被成为行级锁,是因为数据行一旦被某个事务所操作,则该数据行的锁位上就会置为该事务的在该数据行所在的数据块块头上的事务槽号。由于事务槽号对应于一个事务(由XID确定的,在事务表上的),而一个事务对应有一个自己的事务锁(即TX锁),所以该数据行的锁位上置为该事务的在该数据行所在的数据块块头上的事务槽号,表示该数据行被事务槽号对应的事务所拥有的事务锁所保护,故而TX锁又被成为行级锁。该数据行的锁位就是一个标记,标识数据行被哪个事务的事务锁所保护。

(不是)


TX锁是用于提高并发效率的目的,而保护该事务提交前所有被该事务所操作过的数据行的是各自数据行上的行级锁。(参见《Know More About Oracle Row Lock》)。

显示全文