測試對象在執行dml操作時都產生哪些鎖elete和update時產生的鎖以及並發刪除一個表時鎖產生的鎖
測試環境Oracle
具體示例如下
會話首先需要找到此會話的sid
SQL> set time on
set prompt s
s> select sid from v$mystat where rownum<=
SID
會話 然後找到此會話的sid
SQL> set time on
set prompt s
s> select sid from v$mystat where rownum<=
SID
會話查看會話和會話的鎖情況此時因為沒有做任何dml操作所以沒有鎖
SQL> set time on
set prompt s
s> select * from v$lock where sid in()
ADDR KADDR SID TYPE ID ID LMODE REQUEST CTIME BLOCK
會話對a表刪除條數據
s> delete from a where id=
row deleted
查看此時的鎖情況
s> select * from v$lock where sid in()
ADDR KADDR SID TYPE ID ID LMODE REQUEST CTIME BLOCK
BF BF TM
CFC CB TX
會話對a表執行刪除操作但不刪除任何行
s> delete from a where id=
rows deleted
查看此時的鎖情況
結果發現雖然會話
沒有刪除任何行
但是仍然產生了一個TX鎖和TM鎖
估計以後的版本中Oracle會對此進行優化
在滿足通用的情況下通常會有一些特例
s> select * from v$lock where sid in()
ADDR KADDR SID TYPE ID ID LMODE REQUEST CTIME BLOCK
BF BF TM
BC B TM
BDBBC BDBCE TX
CFC CB TX
會話對a表執行刪除操作此時刪除行數據
s> delete from a where id=
row deleted
再次查看會話此時沒有新的鎖增加
s> select * from v$lock where sid in()
ADDR KADDR SID TYPE ID ID LMODE REQUEST CTIME BLOCK
BF BF TM
BC B TM
BDBBC BDBCE TX
CFC CB TX
會話再次刪除b表的數據
s> delete from b where rownum<=
row deleted
查看鎖的情況此時發現對b表新產生一個TM鎖而沒有新增加TX鎖
s> select * from v$lock where sid in()
ADDR KADDR SID TYPE ID ID LMODE REQUEST CTIME BLOCK
BF BF TM
BC B TM
BC BE TM
BDBBC BDBCE TX
CFC CB TX
查看的對象名稱
s> select object_name from user_objects where object_id in()
OBJECT_NAME
B
A
s>
新開一個會話
SQL> set prompt s
s> set time on
s> select sid from v$mystat where rownum<=
SID
s> update a_temp set id= where rownum<
rows updated
s>
查看鎖情況
s> select * from v$lock where sid in()
ADDR KADDR SID TYPE ID ID LMODE REQUEST CTIME BLOCK
BF BF TM
BC B TM
BC BE TM
BDBBC BDBCE TX
CC CA TX
CFC CB TX
rows selected
結論
DML操作一個會話只會產生一個事務鎖(TX)對每個對象只產生一個表鎖(TM)在不同的會話中可以對同一個對象產生多個TM鎖
還有在執行dml操作中即使刪除空行也會產生TX鎖同時伴隨TM鎖但是更新空行只會產生TX鎖不會產生TM鎖
(注在執行dml操作時產生的鎖是lmode=最高級別的事務鎖TM鎖是lmode=的dml級別鎖)
From:http://tw.wingwit.com/Article/program/Oracle/201311/16559.html