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 操作,那麼就有可能產生行鎖等待,引起報錯。
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 操作,那麼就有可能產生行鎖等待,引起報錯。