ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle-tom-dmllock-tx

oracle-tom-dmllock-tx

原创 Linux操作系统 作者:oracle_db 时间:2012-04-23 11:57:53 0 删除 编辑
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/,如需转载,请注明出处,否则将追究法律责任。

上一篇: ORA-01549
下一篇: oracle-tom-dmllock-tm
请登录后发表评论 登录
全部评论

注册时间:2008-11-13

  • 博文量
    158
  • 访问量
    306118