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

我對ORACLE數據鎖的一點體會

2022-06-13   來源: Oracle 

  我對文章中意向鎖的理解就是對表的記錄進行操作之前先對表定義(包括表結構約束等)加了共享鎖這是為了避免對表的DDL操作

  比如當你往TAB插入一條記錄時該表的一個字段COL是允許為空的插入這條記錄的該字段的值是空的此時若不對該表定義加共享鎖則另外一SESSION對TABCOL加非空約束那該表結構修改就與插入的記錄發生沖突了所以當執行DML操作是必定對操作的表加DDL共享鎖

  這是我理解的意向鎖

  文章中提及記錄行是無共享鎖我對此觀點表示不同當插入/修改子表時對應的父表的主鍵記錄應該被加共享鎖因為此時要保證父鍵的存在經測試當插入/修改/刪除子表時父表確實被加了SS鎖此時可以對父表的主鍵做插入動作但不允許做修改/刪除這符合邏輯因為插入操作並不影響主外鍵的關系但刪除/修改則可能

  SHARE VS ROW SHARE有什麼區別?

  我猜想ROW SHARE是(級別=)對表加表定義共享鎖SHARE(級別=)是對表定義及表所有的記錄加共享鎖但這樣就有問題SELECT FOR UPDATE產生TM=對查詢出來的記錄產生TX=的鎖那這樣應該與所有的記錄加共享鎖 相沖突了?但實際並不是實際上當對表加SHARE鎖時還是可以對該表執行 SELECT FOR UPDATE但卻不可以執行DML操作!

  現我只能這樣理解雖然產生了TX= 的事務鎖但實際上還並沒有真正修改記錄和真正的INSERT UPDATE DELETE 操作還是有區別的也就是SELECT FOR UPDATE這個鎖有點特別對加了共享鎖的記錄還可以SELECT FOR UPDATE但若想執行DML語句則不可以因為該表的所有 記錄都加了共享鎖

  若照第點的理解那SRX就是對表加共享鎖對表的所有記錄加排它鎖這是我的猜測不知道在什麼地方會使用上這種鎖

  總結查看了ORACLE的文檔其並不解釋如何定義的各級別的鎖為什麼會這樣定義理由用途何在?現在我想使用各類型鎖來對ORACLE鎖的各級別定義說明

  

  NULL可以某些情況下如分布式數據庫的查詢會產生此鎖

  SS表結構共享鎖

  SX表結構共享鎖+被操作的記錄的排它鎖

  S 表結構共享鎖+所有記錄共享鎖

  SRX 表結構共享鎖+所有記錄排它鎖

  X 表結構排它鎖+所有記錄排它鎖

  其中 SELECT FOR UPDATE是比較特殊的一種情況由於其不修改記錄所以對這些記錄而言並未產生真正的排它鎖這與DML操作產生的排它鎖相比是有差別的但由於不允許在這些記錄加SELECT FOR UPDATE所以也不是純粹的共享鎖我認為其是介於共享鎖和排它鎖之間的一種特殊的情況因此ORACLE在對表加了S鎖後還允許對該表執行SELCT FOR UPDATE但實際上此時此語句已經無意義了因為加了S鎖的表不允許DML操作此語句於普通的SELECT 語句無差別


From:http://tw.wingwit.com/Article/program/Oracle/201311/18652.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.