熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

DML操作update和delete時產生的鎖示例

2013-11-13 12:46:31  來源: Oracle 

  測試對象在執行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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.