mysql 查詢結果行數(shù),MySQL中的行級鎖表級鎖頁級鎖?
1. 程序中非數(shù)據(jù)庫交互操作導致事務掛起
將接口調用或者文件操作等這一類非數(shù)據(jù)庫交互操作嵌入在 SQL 事務代碼之中,那么整個事務很有可能因此掛起(接口不通等待超時或是上傳下載大附件)。
2. 事務中包含性能較差的查詢 SQL
事務中存在慢查詢,導致同一個事務中的其他 DML 無法及時釋放占用的行鎖,引起行鎖等待。
3. 單個事務中包含大量 SQL
通常是由于在事務代碼中加入 for 循環(huán)導致,雖然單個 SQL 運行很快,但是 SQL 數(shù)量一大,事務就會很慢。
4. 級聯(lián)更新 SQL 執(zhí)行時間較久
這類 SQL 容易讓人產(chǎn)生錯覺,例如:update A set ... where ...in (select B) 這類級聯(lián)更新,不僅會占用 A 表上的行鎖,也會占用 B 表上的行鎖,當 SQL 執(zhí)行較久時,很容易引起 B 表上的行鎖等待。
5. 磁盤問題導致的事務掛起
極少出現(xiàn)的情形,比如存儲突然離線,SQL 執(zhí)行會卡在內核調用磁盤的步驟上,一直等待,事務無法提交。
綜上可以看出,如果事務長時間未提交,且事務中包含了 DML 操作,那么就有可能產(chǎn)生行鎖等待,引起報錯。