簡體   English   中英

在 conn.commit() 之后需要 setautocommit(true)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM