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