亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于事務中死鎖的一個問題

關于事務中死鎖的一個問題

喵喔喔 2019-02-18 13:13:32
各位大神,小弟在這里先祝大家新年快樂。 小弟最近遇到一個關于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 加鎖處理分析,看完了應該可以解惑吧。

查看完整回答
反對 回復 2019-03-01
?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

可以使用show innodb engine status看下,deadlock的具體信息。同時explan看下并發執行的語句會使用到的行數。

查看完整回答
反對 回復 2019-03-01
  • 3 回答
  • 0 關注
  • 528 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號