利用悲觀鎖解決資料庫死鎖

2021-08-27 16:52:37 字數 1069 閱讀 7736

reference: [url]

【it168技術文件】

這邊講述的資料庫死鎖是由於查詢條件順序不對而造成的一類,主要是兩個執行緒在同時對乙個資料庫表進行操作時,出現了下列情況,假設乙個資料庫表 內有5行資料,執行緒1需要對1-4行資料進行update操作,而執行緒2需要對2-5行資料進行update操作,但是由於操作的順序調整的不正確,執行緒 1是對資料行1,2,3,4這樣的順序操作,並且加入batch的,而執行緒2是對資料行5,4,3,2這樣的順序操作的,並且加入batch,於是鎖就這 樣產生了:當執行緒1的executebatch進行批量update時,鎖住了123行資料,開始操第4行資料時,此時執行緒二的executebatch 正當操作完第4行資料,準備操作第3行資料,而此時執行緒2則拿著4,5行資料的鎖,並且不會釋放。於是執行緒1發現第4行資料的鎖已經被占用,便開始等待這 個鎖的釋放,對於batch操作來說,在沒有完成整個事務時,執行緒1不會釋放對1,2,3行資料的鎖的擁有權,同樣2號執行緒也在等待1執行緒釋放3號資料的 鎖,同樣等待,這個相互等待的過程將不會結束,直到資料庫有額外的機制來回滾乙個操作。當然,這就意味著這兩個操作裡面有乙個就失敗了。當然,最好的解決 辦法就是調整操作順序使其(操作順序)一致,但是當這個裡面有錯總複雜的問題的時候,比如有時多個執行緒之間對同乙個表操作,或者多個執行緒操作多個表時,理 起來就會變得麻煩。這邊還有乙個方案,對於oracle或者sql server這類支援主觀載入悲觀鎖的資料庫,可以利用這個特性來手動實現資料庫批量操作的事務鎖。針對oracle,可以用select ... for update來載入悲觀鎖,比如需要對於某個字段進行update,則可以用select語句在末尾加上for update把這個字段鎖住,然後進行batch的操作。這邊需要注意的是:

1.對於開始使用select ... for update前,必須將autocommit設定成false;

2.完成乙個update後,必須commit這個事務以便釋放這批鎖。

3.操作時要保證資料庫表沒有其他死鎖,否則也會引起一些問題(sqlplus操作需要commit掉)用這個方法,對於鎖的控制主權更多,一 旦出問題時,除錯更加簡便,缺點是效率還是乙個大問題,畢竟對於大規模資料來說,還是調整執行順序是首選,我這個只能算是個旁門左道,嘿嘿。

資料庫 悲觀鎖

悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無法保...

資料庫之樂觀鎖,悲觀鎖

樂觀鎖 1.只在提交操作時檢查是否違反資料完整性。使用自增長的整數表示資料版本號。更新時檢查版本號是否一致,比如資料庫中資料版本為6,更新提交時version 6 1,使用該version值 7 與資料庫version 1 7 作比較,如果相等,則可以更新,如果不等則有可能其他程式已更新該記錄,所以...

資料庫樂觀鎖與悲觀鎖

每次拿資料的時候都會擔心會被別人修改 疑心重很悲觀 所以每次在拿資料的時候都會上鎖。確保自己使用的過程中不會被別人訪問,自己使用完後再解鎖。期間需要訪問該資料的都會等待。每次拿資料的時候都完全不擔心會被別人修改 心態好很樂觀 所以每次在拿資料的時候都不會上鎖。但是在更新資料的時候去判斷該期間是否被別...