前面说了“手动释放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 |