oracle教程之解决DML事务锁定的冲突(一)
原创
©著作权归作者所有:来自51CTO博客作者Oracle小混子的原创作品,请联系作者获取转载授权,否则将追究法律责任
如果多个用户同时更新相同表的相同记录,或者多个用户需要在表上添加不兼容的锁定(比如某个用户在更新一个表,而另一个用户要修改该表的结构), 则这时就发生了锁定冲突的现象。
1、锁定相关视图
我们要管理并解决锁定冲突的话,需要借助以下这几个数据字典:
(1)v$transaction
记录了当前每个活动事务(也就是还没有提交或者回滚的事务)的信息。其中比较重要的字段包括XIDUSN表示当前事务使用的回滚段的编号、XIDSLOT说明该 事务在回滚段头部的事务表中对应的记录编号(也可以叫做槽号)、XIDSQN说明序列号、STATUS说明该事务是否为活动的。
(2)v$lock
记录了当前session已经获得的锁定以及正在请求的锁定的信息。其中比较重要的字段包括SID说明session的ID号、TYPE说明锁定锁定级别,主要关注TX和TM 、LMODE说明已经获得的锁定的模式,以数字编码表示、REQUEST说明正在请求的锁定的模式,以数字编码表示。BLOCK说明是否阻止了其他用户获得锁定,大 于0说明是,等于0说明否。
锁定模式与编码数值对照关系如下表所示:
(3)v$enqueue_lock
该视图中包含的字段以及字段含义与v$lock中的字段一模一样。只不过该视图中只显示那些申请锁定,但是无法获得锁定的session信息。其中的记录按照申 请锁定的时间先后顺序排列,先申请锁定的session排在前面,排在前面的session将会先获得锁定。
(4)v$locked_object
记录了当前已经被锁定的对象的信息。其中比较重要的字段包括XIDUSN表示当前事务使用的回滚段的编号、XIDSLOT说明该事务在回滚段头部的事务表中对应 的记录编号、XIDSQN说明序列号、OBJECT_ID说明当前被锁定的对象的ID号,可以根据该ID号到dba_objects里查找被锁定的对象名称、LOCKED_MODE说明锁定 模式的数字编码。
(5)v$session
记录了当前session的相关信息。其中比较重要的字段包括SID表示session的编号、SERIAL#表示序列号。SID和SERIAL#可以认为是v$session的主键,它们共 同唯一标识一个session。