2 回答

TA貢獻(xiàn)1820條經(jīng)驗 獲得超9個贊
這可能是由于您的數(shù)據(jù)庫。通常,這種問題來自該側(cè),而不是來自訪問它的編程端。根據(jù)我對db的經(jīng)驗,這些問題通常是由于這一點(diǎn)。最后,編程方面只是“在那個數(shù)據(jù)庫里為我得到那個”的事情。
我毫不費(fèi)力地找到了這個。
它基本上解釋了:
Lock wait timeout
通常發(fā)生在事務(wù)正在等待數(shù)據(jù)行更新時,該數(shù)據(jù)行已被其他事務(wù)鎖定。
您還應(yīng)該檢查這個具有特定事務(wù)問題的答案,這可能會對您有所幫助,因為嘗試更改不同的表可能會超時
查詢試圖更改一個或多個InnoDB表中的至少一行。由于您知道查詢,因此所有被訪問的表都是罪魁禍?zhǔn)椎暮蜻x項。

TA貢獻(xiàn)1906條經(jīng)驗 獲得超3個贊
為了加快數(shù)據(jù)庫中的查詢速度,可以同時執(zhí)行多個事務(wù)。例如,如果有人對公司員工的工資表運(yùn)行選擇查詢(每個員工由id標(biāo)識),而另一個更改了例如已婚人士的姓氏,則可以同時執(zhí)行這兩個查詢,因為它們不會干擾。
但在其他情況下,即使是 SELECT 語句也可能會干擾另一個語句。
為了防止SQL事務(wù)中的意外結(jié)果,事務(wù)遵循ACID模型,該模型代表原子性,一致性,隔離性和持久性(有關(guān)更多信息,請閱讀維基百科)。
假設(shè)事務(wù) 1 開始計算某些內(nèi)容,然后想要將結(jié)果寫入表 A。在編寫之前,它會將所有 SELECT 語句鎖定到表 A。否則,這會干擾隔離要求。因為如果事務(wù) 2 在 1 仍在寫入時啟動,則 2 的結(jié)果取決于 1 已寫入的位置和未寫入的位置。
現(xiàn)在,它甚至可能產(chǎn)生死鎖。例如,在事務(wù) 1 可以寫入表 A 中的最后一個字段之前,它仍然必須向表 B 寫入一些內(nèi)容,但事務(wù) 2 已經(jīng)阻止了表 B 在從 A 讀取后安全地讀取表 B,現(xiàn)在你有一個死鎖。2 想要從被 1 阻止的 A 讀取,因此它等待 1 完成,但 1 等待 2 解鎖表 B 自行完成。
為了解決這個問題,一種策略是在某個超時后回滾某些事務(wù)。(更多這里)
因此,這可能是您的 select 語句的讀取,以獲得超過鎖定等待超時。
但是死鎖通常只是巧合發(fā)生的,所以如果事務(wù) 2 被迫回滾,事務(wù) 1 應(yīng)該能夠完成,以便 2 應(yīng)該能夠在以后的嘗試中成功。
添加回答
舉報