oracle 锁和闩_笔记4:DML锁详解
DML锁
DML锁(DML Lock)用于确保一次只有一个人能修改某一行,而且你正在处理一个表时别人不能删除这个表,在你工作时,Oracle会透明程度不一地为你加这些锁。
TX锁
事务发起第一个修改时会得到TX锁(事务锁),而且会一直持有这个锁,直至事务执行提交(COMMIT)或回滚(ROLLBACK)。TX锁用作一种排队机制,使得其他会话可以等待这个事务执行。事务中修改或通过SELECT FOR UPDATE选择的每一行都会“指向”该事务的一个相关TX锁。听上去好像开销很大,但实际上并非如此。Oracle并没有一个传统的锁管理器,不会有锁管理器为系统中锁定的每一行维护一个长长的列表。不过,其他的许多数据却是这样做的,因为对于这些数据库来说,锁是一种稀有资源,需要对锁的使用进行监视。使用的锁越多,系统要管理的方面就越多,所以在这些系统中,如果使用了“太多的”锁就会有问题。
Oracle不是这样做的。Oracle中的锁定过程如下所示。
(1)找到想锁定的那一行的地址
(2)到达那一行
(3)锁定这一行——在这行的位置,而非某个大列表。
仅此而已,由于锁为数据的一个属性,Oracle不需要传统的锁管理器。事务只是找到数据,如果数据还没有被锁定,则对其锁定。???在Oracle中对数据行锁定时,行指向事务ID的一个副本,事务ID存储在包含数据的块中,释放锁时,事务ID却会保留下来。这个事务ID是事务所独有的,表示了撤销段号、槽和序列号。事务ID留在包含数据行的块上,可以告诉其他会话:你“拥有”这个数据。另一个会话到来时,它会看到事务ID,由于事务ID表示一个事务,所以可以很快地查看持有这个锁的事务是否还是活动的。如果锁不活动,则允许会话访问这个数据。如果锁还是活动的,会话就会要求一旦释放锁就得到通知。因此,这就有了一个排队机制:请求锁的会话会排队,等待目前拥有锁的事务执行,然后得到数据。
V$TRANSACTION,对应每个活动事务都包含一个条目
V$SESSION,显示已经登录的会话
V$LOCK,对应持有所有enqueue队列锁以及正在等待锁的会话,都分别包含一个条目。这并不是说,对于表中被会话锁定的每一行,这个视图中就有相应的一行。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5200.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
