????????我們常常聽說數據庫發生了“長事務”而導致很嚴重的后果。那么何為長事務?長事務是如何產生的?長事務對數據庫有什么影響?如何防止長事務的產生?以下對這幾方面進行闡述和說明,以加深對SinoDB長事務的理解。
1.什么是長事務
??長事務,顧名思義就是一個事務(transaction)執行了很長時間仍未結束。那么一個事務執行多長時間算是長事務?對于SinoDB數據庫來說占用邏輯日志個數的百分比達到長事務高水位線就被定義為一個長事務。
2.事務的控制
??事務的開始和結束,以“begin”為開始,以“commit”或“rollback”結束。“commit”表明事務執行成功,對數據庫所做的修改已經生效,“rollback”則說明事務執行失敗,對數據庫的所有操作均需要撤銷,恢復到事務執行之前的狀態。為了使事務能被撤銷,數據庫也必須對所有操作及被修改前的數據進行日志記錄,以便撤銷時能夠執行逆向操作,將數據恢復到以前的狀態。
3.對日志的使用和影響
??為了防止數據庫因日志資源耗盡發生阻塞,SinoDB設置了長事務高水位線(LTXHWM)和獨占的長事務高水位線(LTXEHWM),當一個事務占用日志個數的百分比達到長事務高水位線LTXHWM就被標識為一個長事務,并自動觸發回滾操作,當百分比達到獨占的長事務高水位線時,其它會話均進入阻塞狀態,只進行長事務回滾操作。
4.長事務產生的幾種原因
??在SinoDB數據庫中,長事務現象發生的原因主要有:
1) 邏輯日志參數設置不合理,日志個數太少或長事務高水位線LTXHWM太低;
2) 數據庫并發很高,事務的粒度太粗,長時間不能提交,最終觸及長事務高水位線;
3) 事務啟動后,未使用commit或rollback來終止事務;
4) 大表連接插入目標表,連接條件不正確產生笛卡爾集,結果集超出預期,長時間不能處理完成;
5) 使用臨時表裝載大量數據,未指定with no log子句,也未設置TEMPTAB_NOLOG參數。
5.如何避免長事務
??長事務帶來的后果是嚴重的,雖然在長事務發生時可以通過手工添加邏輯日志方式來挽救,但是及時性難以保證。不過長事務也是可以避免的,具體可以從以下幾點做起:
1) 根據并發用戶數和業務量合理設置邏輯日志大小和個數,保證大部分事務能正常完成;
2) 適當調低長事務高水位線LTXHWM,確保在長事務發生時有足夠的日志文件用于回滾;
3) 設置參數DYNAMIC_LOGS為2,當無可用日志文件時會自動增加,需要注意的是日志并不是在事務到達LTXHWM之后就開始增加;
4) 合理控制事務的顆粒度,將大事務分割為小事務進行多次提交批量處理,減少單個事務處理時間,提高邏輯日志資源利用率;
5) 事務操作閉環,事務開始之后必須結束,盡量避免回滾,減少對日志和鎖的消耗;
6) 大表進行連接時,盡量保證連接條件唯一,避免產生笛卡爾集,避免產生事務日志;
7) 在創建臨時表應加上with no log字句,或將數據庫參數TEMPTAB_NOLOG指定為1。
更多信息內容請移步星瑞格官方社區,期待大家加入
Sinoregal Tech ForumAsk questions, share solutions, and get to know the Sinoregal community.https://forum.sinoregal.cn/