MySQL執(zhí)行大事務會存在什么問題?
作者:派大星
拆分事務,將大事務分解為多個小事務。將不需要在事務中執(zhí)行的操作(如讀取、內(nèi)存計算、I/O操作、遠程調(diào)用等)移到事務外部處理。
前言
之前在如何實現(xiàn)百萬級數(shù)據(jù)從Excel導入中有提到一句不建議利用大事務進行一個錯誤處理。為什么不建議呢。本次來簡單說一下。
所謂大事務,通常指包含大量要執(zhí)行的SQL語句和較長執(zhí)行時間的事務。
這樣的大事務往往會帶來諸多問題。如下:
- 占用數(shù)據(jù)庫連接:這一點很好理解。隨著SQL語句的增多,執(zhí)行時間也會相應延長。大型事務會持續(xù)占用數(shù)據(jù)庫連接,由于數(shù)據(jù)庫連接資源有限,長時間占用可能導致其他事務無法獲取連接,從而降低系統(tǒng)的吞吐量,影響系統(tǒng)的可用性。
- 難以回滾:大事務涉及的數(shù)據(jù)量較大,回滾操作可能變得異常耗時。若事務需要回滾或失敗,可能需要花費大量時間才能完全撤銷所有修改,對數(shù)據(jù)庫的可靠性和性能造成不利影響。
- 鎖競爭:大事務可能引發(fā)繁瑣的寫操作,導致數(shù)據(jù)的鎖定。這可能導致其他并發(fā)事務在訪問相同資源時遭遇鎖競爭,進而造成性能下降和延遲增加。長時間的鎖定還可能導致其他事務的等待和阻塞。
- 日志空間占用:大事務可能產(chǎn)生大量日志,特別是 binlog。當單個事務超出最大允許的Binlog文件大小限制(max_binlog_cache_size),會出現(xiàn)錯誤:Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again
解決方案:
拆分事務,將大事務分解為多個小事務。將不需要在事務中執(zhí)行的操作(如讀取、內(nèi)存計算、I/O操作、遠程調(diào)用等)移到事務外部處理。
責任編輯:武曉燕
來源:
碼上遇見你