資料庫是乙個多使用者使用的共享資源,當多個使用者併發地訪問資料時,在資料庫中就會產生多個事務同時訪問同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。加鎖是實現資料庫併發控制的乙個非常重要的技術。在實際應用中經常會遇到的與鎖相關的異常情況,當兩個事務需要一組有衝突的鎖,而不能將事務繼續下去的話,就會出現死鎖,嚴重影響應用的正常執行。
鎖型別:
1、共享鎖(share locks,即s鎖):加了共享鎖的資料物件可以被其他事務讀取,但不能修改。資料庫利用這兩種基本的鎖型別來對資料庫的事務進行併發控制。
2、排它鎖(exclusive locks,即x鎖):當資料物件被加上排它鎖時,其他的事務不能對它讀取和修改。
3、獨佔鎖:在共享鎖的基礎上,公升級為獨佔鎖。
4、更新鎖:所有使用者都可以讀,但我將來可能會做更新操作,我已經獲取了從共享鎖(用來讀)到排他鎖(用來更新)的資格。乙個事物只能有乙個更新鎖獲此資格。
出現原因:
1、事務之間對資源訪問順序的交替:乙個使用者1 訪問表a(鎖住了表a),然後又訪問表b;另乙個使用者2 訪問表b(鎖住了表b),然後企圖訪問表a;這時使用者1由於使用者2已經鎖住表b,它必須等待使用者2釋放表b才能繼續,同樣使用者2要等使用者1釋放表a才能繼續,這就死鎖就產生了。解決方案:程式邏輯問題、注意表的呼叫順序
2、併發修改同一記錄:使用者1查詢一條紀錄,然後修改該條紀錄;這時使用者2修改該條紀錄,這時使用者1的事務裡鎖的性質由查詢的共享鎖企圖上公升到獨佔鎖,而使用者2裡的獨佔鎖由於1有共享鎖存在所以必須等1釋放掉共享鎖,而1由於2的獨佔鎖而無法上公升的獨佔鎖也就不可能釋放共享鎖,於是出現了死鎖 :
3、索引不當導致全表掃瞄:事務執行了一條不滿足條件的語句執行了全表掃瞄或表資料量非常大索引建的過少或不合適的時候
解決方案:sql語句中不要使用太複雜的關聯多表的查詢並建索引進行優化
注:1、oracle 檢視死鎖並釋放死鎖
select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode from v$locked_object lo, dba_objects ao, v$session sess where ao.object_id = lo.object_id and lo.session_id = sess.sid;
alter system kill session '738,1429'; --釋放資源
2、mysql 檢視死鎖並釋放死鎖
show processlist --檢視資料庫中各個程序的執行狀態
select * from information_schema.innodb_trx ---查詢正在執行的事務
kill id
詳情參考:oracle 索引全面解析
oracle死鎖原因分析 轉
死鎖的原因 1。模擬死鎖 1。1。主表 create table create table wdz1 wdz1id number not null,memo varchar2 20 alter table wdz1 add constraint primary key wdz1id 1。2。從表 沒...
資料庫常見死鎖原因及處理
資料庫是乙個多使用者使用的共享資源,當多個使用者併發地訪問資料時,在資料庫中就會產生多個事務同時訪問同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。加鎖是實現資料庫併發控制的乙個非常重要的技術。在實際應用中經常會遇到的與鎖相關的異常情況,當兩個事務需要一組有衝...
資料庫常見死鎖原因及處理
資料庫和作業系統一樣,是乙個多使用者使用的共享資源。當多個使用者併發地訪問資料時,在資料庫中就會產生多個事務同時訪問同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。加鎖是實現資料庫併發控制的乙個非常重要的技術。在實際應用中經常會遇到的與鎖相關的異常情況,當兩個...