国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

我對ORACLE數據鎖的一點體會

2024-08-29 13:39:14
字體:
來源:轉載
供稿:網友

  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 語句無差別。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台湾省| 开江县| 岳普湖县| 西充县| 南开区| 应城市| 柘城县| 武清区| 土默特右旗| 乐亭县| 梨树县| 鄱阳县| 渝中区| 开远市| 弥渡县| 黑龙江省| 增城市| 蓬莱市| 邯郸市| 成武县| 扎兰屯市| 陇西县| 诸暨市| 北海市| 文安县| 普洱| 道真| 屏山县| 京山县| 铁力市| 康定县| 达州市| 壶关县| 天津市| 乌拉特中旗| 神池县| 望奎县| 望奎县| 灵石县| 鹿泉市| 长顺县|