如何查看数据库中的死锁、阻塞!

前面说了“手动释放oracle数据库中死锁的对象锁!” 这里再来进一步的记录详细一点!


首先打开一个session1会话

SQL> conn u1/u1
已连接。
SQL> show user
USER 为 "U1"
SQL> select distinct sid from v$mystat;

       SID
----------
       144

再打开一个session2会话

SQL> conn u1/u1
已连接。
SQL> show user
USER 为 "U1"
SQL> select distinct sid from v$mystat;

       SID
----------
       150

用sys用户查看,没有关于session1和session2的锁,也没有被锁住的对象。

SQL> conn /as sysdba
已连接。
SQL> show user
USER 为 "SYS"
SQL> select * from v$lock where sid in(144,150);

未选定行

SQL> select * from v$locked_object;

未选定行

然后session1来锁住t表,成功拉!

SQL> select distinct sid from v$mystat;

       SID
----------
       144

SQL> select * from t where rownum = 1 for update;

        ID OBJECT_NAME
---------- -----------------------------------------
        99 ICOL$

session2试图再来锁住t表,看见了没,被阻塞了。

SQL> select distinct sid from v$mystat;

       SID
----------
       150

SQL> select * from t where rownum = 1 for update;

sys用户再次查看

SQL> select * from v$lock where sid in(144,150) order by sid;

ADDR     KADDR           SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
289C6550 289C6568        144 TM      52931          0          3          0        354          0
28A1C374 28A1C398        144 TX      65569        223          6          0        354          1
289C65FC 289C6614        150 TM      52931          0          3          0        339          0
29434394 294343A8        150 TX      65569        223          0          6        339          0

SQL> select * from v$locked_object;

    XIDUSN    XIDSLOT     XIDSQN  OBJECT_ID SESSION_ID ORACLE_USERNAME                OS_USER_NAME                   PROCESS      LOCKED_MODE
---------- ---------- ---------- ---------- ---------- ------------------------------ ------------------------------ ------------ -----------
         1         33        223      52931        144 U1                             oracle                         2762                   3
         0          0          0      52931        150 U1                             oracle                         2757                   3
说明:

BLOCK=1:这个会话正在阻塞其他的会话,这个SID就持有一个锁,并阻塞别人获得这个锁。

REQUEST=6:非0表示他就是在等待一个锁。这里是6表示他正在等待一个LMODE=6的锁。

ID1和ID2的值完全相同,这是必然的,因为他们都视图锁住同一个对象。

从这个上面的查询可以看出,SID=150的会话有一个LMODE=6的请求,但是他没有获得 ,而是在等待。SID=144的会话持有一个LMODE=6的锁,并阻塞了SID=150的会话请求(BLOCK=1)。


oracle的TM锁、TX锁知识简介:

排它锁(Exclusive Locks,即X锁)当数据对象被加上排它锁时,其他的事务不能对它读取和修改。
共享锁(Share Locks,即S锁)加了共享锁的数据对象可以被其他事务读取,但不能修改。

悲观封锁:锁在用户修改之前就发挥作用。
乐观封锁:在实际修改的时候才加锁。

DML锁(data locks,数据锁),用于保护数据的完整性;
DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;
内部锁和闩(internal locks and latches),保护数据库的内部结构。

DML锁的目的在于保证并发情况下的数据完整性,。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。 当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁。


表1 Oracle的TM锁类型
锁模式 锁描述 解释 SQL操作
0 none   
1 NULL Select
2 SS(Row-S) 行级共享锁,其他对象只能查询这些数据行

Select for update、Lock for update、Lock row share

3 SX(Row-X) 行级排它锁,在提交前不允许做DML操作

Insert、Update、Delete、Lock row share

4 S(Share) 共享锁 Create index、Lock share
5 SSX(S/Row-X) 共享行级排它锁 Lock share row exclusive
6 X(Exclusive) 排它锁

Alter table、Drop able、Drop index、Truncate table 、Lock exclusive

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值