
[英]OracleJDBC Driver : Does driver commits on close() by default even if conn.setAutoCommit is False?
[英]is setautocommit(true) needed after conn.commit()
從池中獲取數據庫連接 ( conn
)。
假設該連接上的autocommit
為 TRUE。
現在conn.setautocommit(false)
已經設置了;
然后經過幾次語句更新,最后conn.commit()/conn.rollback()
完成了。
現在我是否需要執行明確的代碼setautocommit(true)
以恢復到以前的 conn 狀態?
或者commit()\\rollback()
會設置setautocommit(true)
嗎?
這取決於您從何處獲得該連接。 如果您自己創建了連接,則無需恢復自動提交的狀態。
如果是從數據源獲取的,則應該將狀態恢復到原來的狀態,因為數據源可能會將連接保留在池中,而下一段代碼可能不會期望您設置什么。
commit()
不會影響自動提交的值。 啟用自動提交只是確保 JDBC 驅動程序在您執行的每個語句之后調用commit()
。 您仍然可以隨心所欲地調用commit()
,它不會產生任何影響(除了rollback()
不會總是做您想做的事)。
[編輯]如何處理自動提交取決於您的連接池。 dbcp有一個配置選項,可以在為您提供連接之前關閉自動提交,當您返回池時, c3p0將回滾連接。 閱讀有關連接池如何工作的文檔。
如果您不知道使用了哪個池,那么安全的解決方案是在獲得連接時將自動提交設置為false
並在獲得異常時回滾連接。 我建議寫一個包裝器:
public <T> T withTransaction( TxCallback<T> closure ) throws Exception {
Connection conn = getConnection();
try {
boolean autoCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
T result = closure.call(conn); // Business code
conn.commit();
conn.setAutoCommit(autoCommit);
} catch( Exception e ) {
conn.rollback();
} finally {
conn.close();
}
}
此代碼將為您正確處理連接,您無需再在業務代碼中擔心它。
有趣的是, conn.setAutoCommit(true);
暗示commit
(如果它處於autoCommit(false)
模式,請參閱此處,但如果您仍然打破它們,人們可能會更清楚。
在 Oracle 12c 中連接將默認為 autocommit true。 但是如果將自動提交設置為false,則需要在釋放到連接池之前將自動提交重置為true。 conn.setAutoCommit(autoCommit); 應該移動到 finally 塊
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.