關于 mysql 事務中的 rollback 是否必要
在 mysql 事務中,經常會有這樣的疑問:當事務中發生異常時,是否必須進行 rollback 操作?
事務的原理
事務是一個原子性操作,要么全部執行成功,要么全部失敗回滾。開啟事務時,mysql 會創建一個臨時空間來保存所有修改,直到事務提交 (commit) 后,這些修改才會真正應用到數據庫中。
示例代碼
你給出的示例代碼是一個包含以下操作的事務:
START TRANSACTION; update temp2 set username="user2" where id=1; update temp2 set username="user2" where id=2; COMMIT;
登錄后復制
無需 rollback 的情況
你提到了,只要沒有執行 commit,數據庫中的數據就不會更新。因此,如果事務在執行更新語句之前發生異常,則數據不會發生任何變化,此時確實不需要進行 rollback。
需要 rollback 的情況
但是,即使無需更新數據,也依然需要執行 rollback。這是因為:
- 釋放鎖定的資源:事務開始后,mysql 會對涉及到的表進行加鎖,以防止其他事務并發訪問。如果沒有執行 rollback,這些鎖將一直保持,從而導致死鎖或性能問題。
- 結束事務狀態:事務狀態會一直保持,直到執行 commit 或 rollback。如果不結束事務,大量未提交的事務會阻塞數據庫資源,導致 idle in transaction 累積,從而降低性能。
因此,無論事務是否成功,都應及時執行 commit 或 rollback 以釋放鎖定的資源并結束事務狀態。