2015-12-30 86 views
4

請參閱春天DataSourceTransactionManager.java,功能doBegin評論:應該將數據源的自動提交設置爲false?

// 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); 
     } 

在該項目中我的工作,自動提交未配置。所以這是默認情況下。我們使用Spring來管理事務,所有SQL都在@Transactional註釋函數中執行。所以交易實際上是手動提交的。每次事務開始時,數據庫連接都將autocommit設置爲false,並在事務退出autocommit設置爲true之後。典型的工作流程是(在JDBC級別):

  1. conn = dataSource.getConnection();
  2. conn.setAutoCommit(false);
  3. stmt = conn.createStatement();
  4. stmt.executeQuery(...);
  5. conn.commit()/ conn.rollback();
  6. conn.setAutoCommit(true);

設置autocommit來回昂貴嗎?爲了性能原因,我們應該配置數據源連接池autocommit = false嗎?跳過步驟2和步驟6.

回答

0

在批量操作中,您可以在會話中將其設置關閉,並在批量操作完成後再次設置以獲得性能。

SET autocommit=0; 
your code here.... 
SET autocommit=1; 

更新:

由於@codemania很好的解釋,即使有選項可以禁用自動提交按您的要求,但你不應該這樣做。即使這是交易的基本需求,要麼成功地提交一組指令或回滾,如果你這樣做,禁用,那麼你將如何實現它。

如果你正在做一些龐大的任務,如數據遷移等,它會很有用,因爲它可以禁用自動提交,以獲得性能,但只能在該會話中獲得性能。

+0

我已經編輯我的問題來說清楚。 – ShadowDancer

3

1)autocommit完全依賴於數據庫,它的含義是,通過連接的每個語句都將在一個隱式執行的單獨事務中執行。除非和直到,您想要使用個人編碼並避免由可能導致與其他用戶衝突的多個語句持有這些鎖,則不需要將自動提交設置爲false。

2)從視圖性能點,

一)如果你有大量的用戶,並且有一定的衝突,這是因爲數據庫鎖持有的現象發生, 話,可能有必要檢查有關它的問題,但作爲一般規則 規則,自動提交是爲了簡化初學者的東西而引入的。

b)可能存在需要回滾的情況。

c)您想根據特定條件手動提交事務。

編輯:我看到你編輯的問題,要回答你簡單地說,自動提交= false將迫使你自己提交/回滾/等,性能完全依賴於數據庫,鎖的數量舉行寫一瞬間實時!

將自動提交設置爲false並且再次設置爲true不會增加系統的通行費用。

不,請不要配置數據源連接池autocommit = false,除非您出於某種特定原因並且是經驗豐富的人員。從性能角度來看,因爲我已經進行了decalred,所以它取決於數據庫的類型以及實例訪問數據庫的實時用戶,對於您的項目,99.99%您不需要將其設置爲false。

將autocommit設置爲true將只確保在每個語句之後調用commit。

我也看到你正在從一個數據源獲得你的連接,在這種情況下,最好是用默認設置保留連接,以便下一次從連接池中獲取連接時,不會有任何連接麻煩與工作流程

希望這有助於!

+0

我想這些設置自動提交命令將需要兩次往返,併爲我的測試中的每個事務花費額外的0.8毫秒 – ShadowDancer

+0

邏輯上,正如我所看到的那樣,問題將是在事務結束後將自動提交設置爲true,因爲你再次告訴系統返回到默認狀態並自行處理所有事情,當你將自動提交設置爲false時,情況並非如此,所以可能有1次往返不是耗費你0.8milli的兩次,好的事情還取決於在setautocommit之後你正在做什麼,如果你只是關閉了連接,它有什麼關係? :d – codemania23

0

無論何時發出數據庫事務,都應該將autocommit設置爲true。數據庫事務是一個邏輯工作單元,通常由多個數據庫操作(通常是多個更新)組成,並且您希望所有這些操作都成功或者全部失敗。在autocommit = false的情況下,只有在連接對象上調用commit()之前,您的更改纔會持久化,因此此方法可確保所有更新都成功或失敗(通過在發生異常時調用回滾等)。

當autocommit設置爲true(缺省值)時,例如,您可以更改一個表,但在第二次更新時(無論是更新/插入還是刪除),可能會發生異常,您的第二個表沒有得到更新,從而使數據庫處於不一致的狀態。

總而言之,只讀數據或數據庫數據模型簡單並且只有少數用戶可以訪問時,autocommit = true就可以了(這樣對同一數據區域的併發訪問非常少見,甚至某些數據庫不一致時甚至可以被容忍)

相關問題