oracle 列级外键,Oracle 中的外键与锁
文章目錄算是接上篇吧。。。 內容主要來自 Oracle 官方文檔,自己重新畫了下圖。圖中配色來自大神 draveness 的文章,小清新的配色真是美美噠。看來我在學畫圖的路上還要修煉很久啊。。。。。
鎖是一種可以防止多個事務錯誤的更新共享數據的機制,在維護數據庫并發性和一致性方面起著關鍵的作用。在 Oracle 堆組織表中, 數據庫鎖的行為與外鍵列是否有索引有關。如果外鍵未加索引,那么子表可能會被頻繁鎖住,從而導致死鎖,降低并發性。所以,Oracle 官方建議絕對多數情況都為外鍵加索引,除非父表的唯一鍵/主鍵絕對不會更新或刪除。
未加索引的外鍵與鎖
當以下條件都滿足時,數據庫會獲取子表的全表鎖:子表的外鍵列未加索引
父表的主鍵被修改(比如:刪除一行或主鍵被修改)或者合并到父表。在父表插入一條記錄是不會鎖住子表的。
假設 hr.departments 是父表,hr.employees 是子表, hr.employees 中的 department_id 是未加索引的外鍵列。下圖展現了修改父表 department_id = 60 這一記錄的主鍵時,數據庫加鎖的情況:
在上圖中,數據庫在更新父表 department 60 這一記錄的主鍵時,會獲得子表 employees 的全表鎖。這樣其他會話可以查詢子表但不允許更新子表。子表的表鎖會在父表更新完成后立刻釋放。如果修改父表多條記錄,那么修改每一條都會獲得子表的表鎖并釋放。
在 Oracle 9i 及以上版本中,全表鎖都是短期的,僅在 DML 操作期間存在,而不是整個事務。但即便如此,還是要避免,因為全表鎖可能會導致死鎖。Tom 也曾說過,導致死鎖的頭號原因就是外鍵未加索引(第二號原因是表上的位圖索引遭到并發更新)。需要注意,子表的 DML 不會獲得父表的表鎖
加索引的外鍵與鎖
當以下條件都滿足時,數據庫不會獲得子表的全表鎖。子表的外鍵列已加索引
父表的主鍵正在被修改(比如:刪除一行或主鍵被修改)或合并到父表
下面的圖展示了子表 employees 的外鍵列 department_id 加了索引。 當一個事務從父表 department 中刪除 department 280 時, 這一操作不會引起數據庫獲得子表的全表鎖。
父表上的鎖是為了防止其他事務獲取表級排他鎖,但不會阻止父表或子表上的 DML 操作。
如果子表指明了 ON DELETE CASCADE, 那么刪除父表會導致刪除子表對應的記錄。比如刪除父表 department 280 這一記錄,那么子表 employees 中 department_id 為 280 的記錄也會被刪除。 在這種情況下,加鎖的規則與刪除完主表后再刪除子表的記錄是一樣的。
這篇是不是有點水啊。。。。是時候放出我姑家的小霸王 cookie 寶寶撐下場了。雖然我又咬人,又亂叫,還喜歡對著窗簾小便。但我知道我是個好狗狗。
————cookie
總結
以上是生活随笔為你收集整理的oracle 列级外键,Oracle 中的外键与锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle ctl文件7c1b,批量生
- 下一篇: 香港恒生指数代码