各位大神,小弟在這里先祝大家新年快樂。
小弟最近遇到一個關于mysql事務的問題,由于技術底子太單薄,希望借助各位大神的力量解決一下。
問題描述:
現在有一個賬戶,該賬戶是為集成我們服務的第三方平臺分配的,作用基本是用于扣款。
在賬戶表中有一個次數(賬戶金額)的一個字段,賬戶表使用的存儲引擎為InnoDB。
第三方平臺的終端用戶在使用他們的某一項功能時(其實該功能時我們提供的),第三方平臺來調我們的接口,然后我們就減一次上面說的那個次數(賬戶金額)。
其實,說白了就是減庫存的問題。
第三方平臺用戶數量很多,可能會大量并發的過來使用該功能。
我方平臺的這個接口,加了事務控制,使用的是spring4.3.2 + mybatis3.4.1
上面說了,賬戶表的存儲引擎為InnoDB。所以,每次調用我們接口,我們在扣款的時候,應該是開啟了行級鎖,把該賬戶的這條數據鎖住了。以后來的扣款,估計都在等待。
最近經常報出異常為:Deadlock found when trying to get lock; try restarting transaction
我現在很疑惑,為什么是死鎖?而不是等待鎖超時呢?如果為:Lock wait timeout exceeded; try restarting transaction我想我可能會理解,但是Deadlock我就不解了。
因為,第一個扣款線程進來先鎖住那行記錄,第二第三...的扣款線程就在外面一直等著。第一個線程提交事務,釋放InnoDB行級鎖,第二個線程進來獲取鎖...應該為這樣的順序。mysql有一個等待鎖的超時時間,如果超時,那么線程直接timeout。
這里應該不存在死鎖的情況???我理解死鎖應該為,多方牽制導致鎖永遠也釋放不掉。我這種情況不是釋放不掉啊,線程提交或回滾就釋放了的啊?
各位大神,幫忙解釋解釋這個問題吧,停基礎的,但是小弟...不會...
3 回答

慕桂英546537
TA貢獻1848條經驗 獲得超10個贊
數據庫我也不是很了解,鎖是很復雜的東西,你這里的情況可能涉及到當前讀然后給上鎖了。推薦一篇博客MySQL 加鎖處理分析,看完了應該可以解惑吧。
添加回答
舉報
0/150
提交
取消