事物導致的死鎖問題分析

2021-09-02 13:38:55 字數 2845 閱讀 1981

先看異常日誌

在乙個事物中既有update,又有select for update(意向排它鎖)

資料庫中,有user_id的索引和user_id與auth_type的聯合索引

session 1

session 2

begin;

begin;

update cre_auth_status set user_id='29507138388754432',auth_type=4,auth_status=2,update_time='2018-11-21 09:32:35.414' where (user_id='29507138388754432' and auth_type=2)

排它鎖,因為有單獨索引,將鎖

user_id='29507138388754432'

的相關資料表單鎖定。

update cre_auth_status set user_id='29507138388754432',auth_type=9,auth_status=2,update_time='2018-11-21 09:32:35.414' where (user_id='29507138388754432' and auth_type=9)

排它鎖pending

select id, user_id, basic_type, auth_type, auth_status, task_id, auth_time, expire_time, create_time, update_time from cre_auth_status where user_id = '29507138388754432' and basic_type =3 and auth_status =2 for update

需要等待

user_id='29507138388754432'

的資料釋放,鎖也是處於

pending

狀態,和

session2

爭搶鎖資源,進入死鎖。

select

時,user_id

的索引需要鎖住了

user_id=』 29507138388754432』

的資料,等待

session2

中的update

釋放,但是因為

session2

中的排它鎖是

pending

狀態,未

commit

,鎖等待中,進入死鎖

select id, user_id, basic_type, auth_type, auth_status, task_id, auth_time, expire_time, create_time, update_time from cre_auth_status where user_id = '29507138388754432' and basic_type =3 and auth_status =2 for update

死鎖出現異常,事物回滾

拿到鎖,正常流程往下走

解決方式:

將事物放在

update

裡,等待

update

結束之後,再進行

select

;去掉事物,事物在這裡屬於畫蛇添足。

@override

public

void

updateauthstatus(long userid,integer authtype,integer authstatus,string operatorgid,int

retrynum)catch(exception e)",e);

}

}

DDL導致的死鎖

mariadb galera cluster 中做ddl時會引起死鎖,但這個死鎖並不是由於併發導致的。而是galera cluster中特有的 坑 當在mariadb galera cluster中做ddl時,相關表的讀寫事務都會報死鎖的異常。error 1213 40001 deadlock fo...

SQL Server 死鎖問題的分析

一 什麼是死鎖?簡單來說,我和你,金鎖和銀鎖。我拿著金鎖,我需要再拿到銀鎖,才能完成任務,你拿著銀鎖,你需要再拿到金鎖,才能完成任務。我拿不到銀鎖,你拿不到金鎖,這就形成死鎖了。二 死鎖發生後,sql server怎麼處理?sql server內建有死鎖偵測和處理機制,每5s會檢測一次,如果有死鎖,...

windbg分析死鎖問題

如下 include include include using namespace std critical section cs db1 critical section cs db2 dword winapi threadproc lpvoid lpparam void main delete...