事務(wù)一 | 事務(wù)二 | 備注 |
---|---|---|
BEGIN; | BEGIN; | 分別開(kāi)始兩個(gè)事務(wù) |
UPDATE t_lock SET col = col + 100 WHERE id = 1; |
UPDATE t_lock SET col = col + 200 WHERE id = 2; |
事務(wù)一修改 id=1 的數(shù)據(jù),事務(wù)二修改 id=2 的數(shù)據(jù) |
UPDATE t_lock SET col = col + 100 WHERE id = 2; |
事務(wù)一修改 id=2 的數(shù)據(jù),需要等待事務(wù)二釋放寫(xiě)鎖 | |
等待中… | UPDATE t_lock SET col = col + 200 WHERE id = 1; |
事務(wù)二修改 id=1 的數(shù)據(jù),需要等待事務(wù)一釋放寫(xiě)鎖 |
死鎖 | 死鎖 | 數(shù)據(jù)庫(kù)檢測(cè)到死鎖,選擇中止一個(gè)事務(wù) |
更新成功 | 返回錯(cuò)誤 |
對(duì)于 MySQL InnoDB,默認(rèn)啟用了 innodb_deadlock_detect 選項(xiàng),事務(wù)二返回以下錯(cuò)誤信息:
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
如果我們禁用 InnoDB 死鎖檢測(cè)選項(xiàng),事務(wù)二在等待 50 s(innodb_lock_wait_timeout )后提示等待超時(shí):
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
Oracle 檢測(cè)到死鎖時(shí)返回以下錯(cuò)誤:
ORA-00060: 等待資源時(shí)檢測(cè)到死鎖
Microsoft SQL Server 檢測(cè)到死鎖時(shí)返回的錯(cuò)誤如下
消息 1205,級(jí)別 13,狀態(tài) 51,第 7 行
事務(wù)(進(jìn)程 ID 67)與另一個(gè)進(jìn)程被死鎖在 鎖 資源上,并且已被選作死鎖犧牲品。請(qǐng)重新運(yùn)行該事務(wù)。
PostgreSQL 檢測(cè)到死鎖時(shí)返回的錯(cuò)誤如下:
SQL 錯(cuò)誤 [40P01]: 錯(cuò)誤: 檢測(cè)到死鎖
詳細(xì):進(jìn)程32等待在事務(wù) 4765上的ShareLock; 由進(jìn)程16552阻塞.
進(jìn)程16552等待在事務(wù) 4766上的ShareLock; 由進(jìn)程32阻塞.
建議:詳細(xì)信息請(qǐng)查看服務(wù)器日志.
在位置:當(dāng)更新關(guān)系"t_lock"的元組(0, 1)時(shí)
死鎖不是數(shù)據(jù)庫(kù)自身的問(wèn)題,我們無(wú)法通過(guò)優(yōu)化數(shù)據(jù)庫(kù)配置來(lái)解決或者避免死鎖,只能通過(guò)修改應(yīng)用程序來(lái)解決。簡(jiǎn)單來(lái)說(shuō),我們應(yīng)該在程序中按照相同的順序修改數(shù)據(jù),避免產(chǎn)生相互等待資源的情況發(fā)生。例如:
事務(wù)一 | 事務(wù)二 | 備注 |
---|---|---|
BEGIN; | BEGIN; | 分別開(kāi)始兩個(gè)事務(wù) |
UPDATE t_lock SET col = col + 100 WHERE id = 1; |
UPDATE t_lock SET col = col + 200 WHERE id = 1; |
事務(wù)一和事務(wù)二都修改 id=1 的數(shù)據(jù),后執(zhí)行的事務(wù)需要等待 |
UPDATE t_lock SET col = col + 100 WHERE id = 2; |
等待中… | 事務(wù)一修改 id=1 的數(shù)據(jù),事務(wù)二等待中 |
COMMIT; | 等待中… | 事務(wù)一提交 |
UPDATE t_lock SET col = col + 200 WHERE id = 2; |
事務(wù)二繼續(xù)修改 id=2 的數(shù)據(jù) | |
COMMIT; | 事務(wù)二提交 |
以上場(chǎng)景不會(huì)產(chǎn)生死鎖。不過(guò),我們?cè)趯?shí)際應(yīng)用中可能無(wú)法完全按照相同順序修改數(shù)據(jù)。如果出現(xiàn)了不可避免的死鎖情況,另一種解決方法就是捕獲系統(tǒng)返回的死鎖異常并在程序中加入重試機(jī)制。
本文簡(jiǎn)要介紹了數(shù)據(jù)庫(kù)死鎖產(chǎn)生的原因和解決方法。到此這篇關(guān)于5分鐘快速了解數(shù)據(jù)庫(kù)死鎖產(chǎn)生的場(chǎng)景和解決方法的文章就介紹到這了,更多相關(guān)數(shù)據(jù)庫(kù)死鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:鶴崗 常德 昆明 葫蘆島 沈陽(yáng) 石嘴山 招商 保定
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《5分鐘快速了解數(shù)據(jù)庫(kù)死鎖產(chǎn)生的場(chǎng)景和解決方法》,本文關(guān)鍵詞 5分鐘,快速,了解,數(shù)據(jù)庫(kù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。