Oracle中的锁类型主要分以下3种:
DML锁(DML lock):DML 代表数据操纵语言(Data Manipulation Language)。一般来讲,表示select,insert,update,merge和delete语句。DML锁机制允许兵法之行数据修改。例如,DML锁可能是特定数据行上的锁,或者是锁定表中所有行的表级锁。
DDL锁(DDL lock):DDL代表数据定义语言(Data Definition Language),如create和alter语句等。DDL锁可以保护对象结构定义。
内部锁和闩:Oracle使用这些锁来保护其内部数据结构。例如,Oracle解析一个查询并生成优化的查询计划时,它会把库缓存“临时闩”,将计划放在耐,以供其他绘画使用。闩(latch)是Oracle采用的一种轻量级的低级串行化设备,going 能上类似于锁。闩是数据库中导致竞争的一个常见原因。
下面我们主要看看DML锁和DDL锁。
DML锁中主要为TX锁和TM锁。TX锁为事务锁,事务发起第一个修改时会得到TX锁(事务锁),而且会一直持有这个锁,直至事务执行提交(commit)或回滚(rollback)。
TM(DML Enqueue)锁用于确保在修改表的内容时,表的结构不会改变。例如,如果更新了一个表,会得到这个表的一个TM锁。这会防止另一个用户在该表上执行DROP或ALTER命令。如果表上有TM锁,而另一个用户试图在这个表上执行DDL,就会得到一个ORA-00054的错误提示。
查看TM锁,可以直接查看v$locked_object视图,关于v$locked_object视图,Oracle官方文档的解释如下:
This view lists all locks acquired by every transaction on the system. It shows which sessions are holding DML locks (that is, TM-type enqueues) on what objects and in what mode.
TM锁的类型:
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 table、Drop index、Truncate table 、Lock exclusive
对于DDL锁,可以在v$lock视图中明显看到,v$lock.lock_type=DL
0000000090D8F1F8 0000000090D8F250 34 TO 79833 1 3 0 1951 0
0000000090D8F738 0000000090D8F790 35 AE 100 0 4 0 3351 0
000000008F637248 000000008F6372C0 37 TX 458782 1359 6 0 2 0
0000000090D8F118 0000000090D8F170 37 AE 100 0 4 0 3345 0
00007FA09E881C20 00007FA09E881C80 37 TM 88590 0 4 0 2 0
0000000090D8E680 0000000090D8E6D8 37 DL 88590 0 3 0 2 0
0000000090D8E5A0 0000000090D8E5F8 37 DL 88590 0 3 0 2 0
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
00007FA09E881C20 00007FA09E881C80 37 TM 18 0 3 0 2 0
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23850820/viewspace-2122302/,如需转载,请注明出处,否则将追究法律责任。