我對ORACLE資料鎖的一點體會
我對ORACLE資料鎖的一點體會
該貼的部分內容是針對帖中帶的附件(一位大俠關於鎖的理解),提的理解/疑問,
大家在讀此貼前,請先閱讀該文。
先說說各型別的鎖:共享鎖,排它說,共享排它鎖(對錶定義共享,對錶操作的記錄排它)。
1、我對文章中意向鎖的理解,就是:對錶的記錄進行操作之前,先對錶定義(包括表結構、約束等)
加了共享鎖,這是為了避免對錶的DDL操作。
比如:當你往TAB1插入一條記錄時,該表的一個欄位COL8是允許為空的,插入這條記錄的該欄位
的值是空的,此時,若不對該表定義加共享鎖,則另外一SESSION對TAB1.COL8加非空約束,
那該表結構修改就與插入的記錄發生衝突了。所以,當執行DML操作是,必定對操作的表加DDL
共享鎖。
這是我理解的意向鎖。
2、文章中提及,記錄行是無共享鎖。我對此觀點表示不同:當插入/修改子表時,對應的父表的主鍵
記錄應該被加共享鎖,因為此時要保證父鍵的存在。經測試,當插入/修改/刪除子表時,父表
確實被加了SS鎖,此時可以對父表的主鍵做插入動作,但不允許做修改/刪除。這符合邏輯。因為
插入操作並不影響主外來鍵的關係。但刪除/修改則可能。
3、SHARE VS ROW SHARE有什麼區別?
我猜想:ROW SHARE是(級別=2)對錶加表定義共享鎖,SHARE(級別=4)是對錶定義及表“所有”的
記錄加共享鎖。但這樣就有問題:1、SELECT FOR UPDATE產生TM=2、對查詢出來的記錄產生TX=6的
鎖,那這樣應該與:表“所有”的記錄加共享鎖 相沖突了?但實際並不是,實際上,當對錶加SHARE
鎖時,還是可以對該表執行 SELECT FOR UPDATE,但卻不可以執行DML操作!
現我只能這樣理解,雖然產生了TX=6 的事務鎖,但實際上,還並沒有真正修改記錄。和真正的
INSERT ,UPDATE, DELETE 操作還是有區別的。也就是:SELECT FOR UPDATE這個鎖有點特別:
對加了共享鎖的記錄,還可以SELECT FOR UPDATE,但若想執行DML語句,則不可以,因為該表的
“所有” 記錄都加了共享鎖。
4、若照第3點的理解,那SRX就是對錶加共享鎖,對錶的所有記錄加排它鎖。這是我的猜測,不知道
在什麼地方會使用上這種鎖。
總結:檢視了ORACLE的文件,其並不解釋如何定義的各級別的鎖,為什麼會這樣定義,理由、用途何
在?現在我想使用各型別鎖,來對ORACLE鎖的各級別定義說明:
0、無
1、NULL,可以某些情況下,如分散式資料庫的查詢會產生此鎖。
2、SS,表結構共享鎖
3、SX,表結構共享鎖+被操作的記錄的排它鎖
4、S, 表結構共享鎖+所有記錄共享鎖
5、SRX 表結構共享鎖+所有記錄排它鎖
6、X 表結構排它鎖+所有記錄排它鎖
其中 SELECT FOR UPDATE是比較特殊的一種情況:由於其不修改記錄,所以對這些記錄而言,
並未產生真正的排它鎖,這與DML操作產生的排它鎖相比,是有差別的,但由於不允許在這些記錄“再”
加SELECT FOR UPDATE,所以,也不是純粹的共享鎖,我認為其是介於共享鎖和排它鎖之間的一種特殊
的情況,因此,ORACLE在對錶加了S鎖後,還允許對該表執行SELCT FOR UPDATE,但實際上,此時此語句
已經無意義了,因為加了S鎖的表不允許DML操作,故,此語句於普通的SELECT 語句無差別。
請拍磚。
大家在讀此貼前,請先閱讀該文。
先說說各型別的鎖:共享鎖,排它說,共享排它鎖(對錶定義共享,對錶操作的記錄排它)。
1、我對文章中意向鎖的理解,就是:對錶的記錄進行操作之前,先對錶定義(包括表結構、約束等)
加了共享鎖,這是為了避免對錶的DDL操作。
比如:當你往TAB1插入一條記錄時,該表的一個欄位COL8是允許為空的,插入這條記錄的該欄位
的值是空的,此時,若不對該表定義加共享鎖,則另外一SESSION對TAB1.COL8加非空約束,
那該表結構修改就與插入的記錄發生衝突了。所以,當執行DML操作是,必定對操作的表加DDL
共享鎖。
這是我理解的意向鎖。
2、文章中提及,記錄行是無共享鎖。我對此觀點表示不同:當插入/修改子表時,對應的父表的主鍵
記錄應該被加共享鎖,因為此時要保證父鍵的存在。經測試,當插入/修改/刪除子表時,父表
確實被加了SS鎖,此時可以對父表的主鍵做插入動作,但不允許做修改/刪除。這符合邏輯。因為
插入操作並不影響主外來鍵的關係。但刪除/修改則可能。
3、SHARE VS ROW SHARE有什麼區別?
我猜想:ROW SHARE是(級別=2)對錶加表定義共享鎖,SHARE(級別=4)是對錶定義及表“所有”的
記錄加共享鎖。但這樣就有問題:1、SELECT FOR UPDATE產生TM=2、對查詢出來的記錄產生TX=6的
鎖,那這樣應該與:表“所有”的記錄加共享鎖 相沖突了?但實際並不是,實際上,當對錶加SHARE
鎖時,還是可以對該表執行 SELECT FOR UPDATE,但卻不可以執行DML操作!
現我只能這樣理解,雖然產生了TX=6 的事務鎖,但實際上,還並沒有真正修改記錄。和真正的
INSERT ,UPDATE, DELETE 操作還是有區別的。也就是:SELECT FOR UPDATE這個鎖有點特別:
對加了共享鎖的記錄,還可以SELECT FOR UPDATE,但若想執行DML語句,則不可以,因為該表的
“所有” 記錄都加了共享鎖。
4、若照第3點的理解,那SRX就是對錶加共享鎖,對錶的所有記錄加排它鎖。這是我的猜測,不知道
在什麼地方會使用上這種鎖。
總結:檢視了ORACLE的文件,其並不解釋如何定義的各級別的鎖,為什麼會這樣定義,理由、用途何
在?現在我想使用各型別鎖,來對ORACLE鎖的各級別定義說明:
0、無
1、NULL,可以某些情況下,如分散式資料庫的查詢會產生此鎖。
2、SS,表結構共享鎖
3、SX,表結構共享鎖+被操作的記錄的排它鎖
4、S, 表結構共享鎖+所有記錄共享鎖
5、SRX 表結構共享鎖+所有記錄排它鎖
6、X 表結構排它鎖+所有記錄排它鎖
其中 SELECT FOR UPDATE是比較特殊的一種情況:由於其不修改記錄,所以對這些記錄而言,
並未產生真正的排它鎖,這與DML操作產生的排它鎖相比,是有差別的,但由於不允許在這些記錄“再”
加SELECT FOR UPDATE,所以,也不是純粹的共享鎖,我認為其是介於共享鎖和排它鎖之間的一種特殊
的情況,因此,ORACLE在對錶加了S鎖後,還允許對該表執行SELCT FOR UPDATE,但實際上,此時此語句
已經無意義了,因為加了S鎖的表不允許DML操作,故,此語句於普通的SELECT 語句無差別。
請拍磚。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12801008/viewspace-607655/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 我對EVE的一點點理解
- 我對人生的一點思考
- 對“主資料”的一點吐槽
- oracle資料庫事務transaction鎖lock模式思考之一Oracle資料庫模式
- oracle Mysql PostgreSQL 資料庫的對比OracleMySql資料庫
- 我在創業公司做技術一年多的一點體會創業
- 使用Immutable js的一點體會JS
- Oracle、NoSQL和NewSQL 資料庫技術對比(一)OracleSQL資料庫
- Oracle 對某列的部分資料建立索引Oracle索引
- 說的好像有一點點道理,我都沒有反對
- oracle資料庫事務transaction 不同的鎖lock型別Oracle資料庫型別
- oracle資料庫檢視鎖表的sql語句整理Oracle資料庫SQL
- oracle的鎖Oracle
- 記錄一下MySql update會鎖定哪些範圍的資料MySql
- 關於資料庫事務和鎖的必會知識點,你掌握了多少?資料庫
- Oracle ADW業務資料平臺點亮DTCC2019資料庫技術大會!Oracle資料庫
- 我的一套較全面的oracle資料庫監控管理指令碼Oracle資料庫指令碼
- Oracle資料庫搬家牽扯出的一些知識點記錄Oracle資料庫
- 我對前後端資料模型和資料流的理解後端模型
- oracle事務transaction鎖lock一點兒小思考或總結Oracle
- Oracle - 資料庫的記憶體結構Oracle資料庫記憶體
- Oracle - 資料庫的記憶體調整Oracle資料庫記憶體
- 對資料庫的大體理解資料庫
- Oracle和sqlserver資料型別對應OracleSQLServer資料型別
- 【鎖】Oracle鎖系列Oracle
- 磁碟排序對Oracle資料庫效能的影響PT排序Oracle資料庫
- oracle 會話(session)被鎖瞭解決方法Oracle會話Session
- 談談我對Ui設計師的一些觀點UI
- Oracle資料型別對應Java型別Oracle資料型別Java
- 資料庫選型比對 Oracle vs sqlserver資料庫OracleSQLServer
- Oracle 如何快速的 duplicate 一個資料庫Oracle資料庫
- oracle檢視被鎖的表和解鎖Oracle
- 對OceanBase“一體化”產品戰略的一點淺見
- Oracle:select 或 inactive 會話語句產生鎖?Oracle會話
- 簡露一手-一次大型業務系統的突發故障-有必要知道一點點Oracle鎖故Oracle
- Jtti:MySQL 資料庫中update語句會不會發生死鎖JttiMySql資料庫
- 程式設計面試題:編寫一個會造成資料庫死鎖的應用程式設計面試題資料庫
- 資料庫中的共享鎖與排他鎖資料庫
- 一點點進步的OceanBase資料庫文件!資料庫