ORACLE 的DML锁作用:确保一次,只有一个人能修改某一行,你在处理这个表时,别人不能删除这个表
tx锁--事务锁,当事务发起第一个修改时会得么TX锁,直到事务提交或回滚。
TX锁原理--是一种排队机制,使得其它会话可以等待这个事务执行。
如:
会话1:
SQL> select owner,table_name from t where wner='SCOTT';
OWNER TABLE_NAME
------------------------------ ------------------------------
SCOTT DEPT
SCOTT EMP
SCOTT BONUS
SCOTT SALGRADE
SCOTT SCOTTBK
SCOTT DEMO
6 rows selected.
SQL> update t set wner='XXX' where table_name='DEMO';
1 row updated.【这里会话1发起了更新】
会话2去查看这个时候的锁情况,前提假设数据库是单用户!!
SQL> select username,
2 v$lock.sid,
3 trunc(id1/power(2,16)) rbs,
4 bitand(id1,to_number('ffff','xxxx'))+0 slot,
5 id2 seq,
6 lmode,
7 request
8 from v$lock, v$session
9 where v$lock.type = 'TX'--查找TX类型锁
10 and v$lock.sid = v$session.sid
11 and v$session.username = USER;
USERNAME SID RBS SLOT SEQ LMODE REQUEST
---------- ---------- ---------- ---------- ---------- ---------- ----------
SYS 159 3 12 469 6 0
[LMODE=6]表示是一个排他锁,REQUEST=0说明表示该会话没有发出请求,该会话拥有这个锁
SQL> select XIDUSN, XIDSLOT, XIDSQN
2 from v$transaction;[对于每个活动的事务都包含一条记录]
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
3 12 469
SQL>
如果把会话1的更新事务提交,以上的两个查询都没有记录。因为提交以后事务结束了,锁就释放了。
TX锁原理---排队机制
会话1:
SQL> update emp set ename=upper(ename);
14 rows updated.
会话2:
SQL> conn scott/scott
Connected.
SQL> update dept set deptno=deptno-10;
这个时候发现会话2中无法更新,因为会话2已经被阻塞了。
会话3.
SQL> col blocker format a10
SQL> col blockee format a10
SQL> select
2 (select username from v$session where sid=a.sid) blocker,
3 a.sid,
4 ' is blocking ',
5 (select username from v$session where sid=b.sid) blockee,
6 b.sid
7 from v$lock a, v$lock b
8 where a.block = 1
9 and b.request > 0
10 and a.id1 = b.id1
11 and a.id2 = b.id2;
BLOCKER SID 'ISBLOCKING' BLOCKEE SID
---------- ---------- ------------- ---------- ----------
SCOTT 159 is blocking SCOTT 145
SQL>
这个时候一会话1如果提交,那会话2马上会跟着提交,也就是说会话2在等待会话1释放掉TX锁,排队等候机制。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15720542/viewspace-722027/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/15720542/viewspace-722027/
本文详细介绍了Oracle数据库中的TX锁机制,包括其作用、获取及释放的过程,并通过具体示例展示了不同会话间如何通过TX锁进行操作排队及等待。

被折叠的 条评论
为什么被折叠?



