目的 描述鎖定機制以及Oracle如何管理數據併發處理 監視和解決鎖定衝突 鎖 -可防止多個會話同時更改同一數據 -是在指定語句的最低可能級別自動獲取的 -不會升級 事務處理可以鎖定單個數據行,多個數據行,甚至整個表。Oracle DB支持手動鎖定和自動鎖定。自動獲取的鎖總是選擇儘可能低的鎖定級別, ...
目的 描述鎖定機制以及Oracle如何管理數據併發處理 監視和解決鎖定衝突 鎖 -可防止多個會話同時更改同一數據 -是在指定語句的最低可能級別自動獲取的 -不會升級 事務處理可以鎖定單個數據行,多個數據行,甚至整個表。Oracle DB支持手動鎖定和自動鎖定。自動獲取的鎖總是選擇儘可能低的鎖定級別,以儘量減少與其它事務處理的潛在衝突。 鎖定機制 高級數據併發處理 -執行插入,更新和刪除時使用行級鎖 -查詢不要要任何鎖 自動隊列管理 在事務處理結束(使用COMMIT或ROLLBACK操作)之前會一直保持鎖定 註意:事務處理修改數據時會獲取行級鎖,而不是塊級或表級鎖。修改對象(如表移動)時會獲取對象鎖,而不是整個資料庫鎖或schema鎖。 SQL> LOCK TABLE employees IN EXCLUSIVE MODE; 鎖模式 ROW SHARE:允許對鎖定的表進行併發訪問,但禁止在會話中鎖定整個表進行獨占訪問。 ROW EXCLUSIVE:與ROW SHARE相同,但是同時禁止以SHARE模式鎖定。更新,插入或刪除數據時會自動獲取ROW EXCLUSIVE鎖。ROW EXCLUSIVE鎖允許多個進行執行讀取,但只允許一個進程執行寫入。 SHARE:允許併發查詢,但禁止更新鎖定的表。需要具有SHARE鎖才能創建表的索引,創建時會自動請求該鎖。但是,創建聯機索引的操作在建立索引時需要具有ROW SHARE鎖。共用鎖允許多個進程進行讀取,但不允許執行寫入。刪除或更新某個父表中的行,並且其子表在該父表上具有外鍵約束條件時,也會以透明方式使用共用鎖。 SHARE ROW EXCLUSIVE:用於查詢整個表,允許其他人查詢表中的行,但禁止其他人在SHARE模式下鎖定表或更新行。 EXCLUSIVE:允許查詢鎖定表,禁止對鎖定表執行任何其他活動。需要具有EXCLUSIVE鎖才能刪除表。 DML鎖 每個DML事務處理必須獲取兩個鎖: 針對正在更新的一行或多行的EXCLUSIVE行鎖 針對正在更新的表的ROW EXCLUSIVE(RX)模式下的表所(TM),這個可避免在進行更改時另一會話鎖定整個表(可能會刪除或截斷表)。這種模式也稱為子排它表鎖(SX)。 入隊機制 鎖定請求自動排隊。只要持有某個鎖的事務處理一完成,隊列中的下一個會話就接收該鎖。入隊機制會跟蹤請求鎖的順序及請求的鎖模式。已經持有鎖的會話可請求轉換鎖,而不必排到隊尾。 等待入隊的進程分為兩類:沒有共用所有權的等待進程,以及有共用所有權/但沒有選擇升級鎖級別的等待進程。第二類等待進程稱為轉換進程,這類進程的優先順序始終高於正常等待進程,即使其等待時間較短。 入隊機制用於跟蹤 -等待鎖的會話 -請求的鎖模式 -會話請求鎖的順序 鎖衝突 鎖衝突的可能原因 -未提交更改 -長時間運行事務處理:同時執行事務和批量時通常會發生鎖衝突。 -不必要的高鎖定級別 檢測鎖衝突 -提交或回退持有鎖的會話 -終止持有鎖的會話(在緊急情況下) 註:如果會話出現空閑超時,PMON會話檢測程式會自動終止會話,這可以使用概要文件或資源管理器來完成。 使用SQL解決鎖衝突 SELECT SID,SERIAL#,USERNAME FROM V$SESSION WHERE SID IN (SELECT BLOCKING_SESSION FROM V$SESSION); ALTER SYSTEM KILL SESSION '<SID>,<SERIAL#>' IMMEIDATE; ALTER SYSTEM DISCONNECT SESSION '<SID>,<SERIAL#>' IMMEDIATE; 死鎖 死鎖是鎖衝突的一種特殊情況。兩個或更多會話等待已被其中另一個會話鎖定的數據時,就會發生死鎖。因為每個會話都在等待另一個會話釋放鎖,所以任何一個會話都不能完成事務處理,也就不能解決衝突。Oracle DB會自動檢測死鎖並終止發生錯誤的語句。