Spring Data JPA 或 Hibernate 默認將自動提交設定為 false。這聽起來很合理,因為這些框架與物體一起作業,并且對物體的更新可能涉及通過多個 SQL 查詢對多個表進行更新。因此,通過將自動提交設定為 false 并顯式控制事務,這些框架確保對物體的更改是原子的且一致的。
但是現在 Hikari 是 spring 資料 jpa 的默認連接池提供程式,在查看應用程式日志時,我看到 hikari 將連接池的自動提交設定為 true。
2021-10-24 11:30:07.815 DEBUG [restartedMain] com.zaxxer.hikari.HikariConfig||HikariConfig.logConfiguration:1135: autoCommit................................true
關于為什么這樣設定以及這是否會影響事務的任何解釋(我認為它不會影響事務,因為每個事務可能會再次將自動提交設定為 false,從而接管何時提交事務。)
編輯 - 遵循@ken-chan 的回答和討論。
對于使用帶有@Transactional(100% Hiberante)的 spring data jpa 的專案,將 hikaris 連接池設定更改為auto-commit=false應該會帶來性能優勢。有關更多詳細資訊,請參閱答案和后續討論。
uj5u.com熱心網友回復:
我認為 Hikari 只是遵循 JDBC 定義的默認自動提交值(即 true),以便與其默認行為保持一致。(見這個)
并且您的猜測是正確的,該框架將注意配置 JDBC 必要的自動提交值,Connection以便它可以通過多個 JDBC 執行事務處理Statement。
例如在@Transactionl使用 JDBC 的Spring中,以下代碼顯示如果啟用了自動提交,它將在執行任何事務代碼之前禁用它。它還將在完成交易后重新啟用它。
// Switch to manual commit if necessary. This is very expensive in some JDBC drivers,
// so we don't want to do it unnecessarily (for example if we've explicitly
// configured the connection pool to set it already).
if (con.getAutoCommit()) {
txObject.setMustRestoreAutoCommit(true);
if (logger.isDebugEnabled()) {
logger.debug("Switching JDBC Connection [" con "] to manual commit");
}
con.setAutoCommit(false);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/335976.html
