2011-04-13 99 views
2

我正在使用Spring Framework 3和Hibernate 3.6開發Web應用程序,並試圖理解事務管理是如何工作的。 我使用mySQL Server 5.1和InnoDB表。我編寫了基於純Hibernate 3 API的DAO。使用Spring,Hibernate和mySQL進行事務管理

1)這是正確的,mySQL服務器本身指定如何處理事務?這意味着它決定何時需要鎖定記錄?

2)當我聲明在彈簧的方法如@Transactional(readOnly的= TRUE)或@Transactional(唯讀= FALSE)這是否影響如果datarecords在事務期間鎖定?這意味着,當readOnly = true時,沒有datarecord被鎖定,當readOnly = false時,所有使用的datarecords都被鎖定了?

3)當我讀取readOnly = true並且讀取各種數據記錄時會發生什麼。讓我們假設在閱讀過程中他們被另一個交易所改變,以便我得到一些舊的記錄和一些新的記錄。那可能嗎?

4)什麼時候發生提交?成功交易後或會話結束後?

5)何時啓動hibernate會話?每個會話(服務器和客戶端之間)還是每個事務?

6)到底誰負責交易管理?春天或MySQL或兩者?

感謝您的回答! :-)

回答

4

1)是否正確,mySQL服務器本身指定了如何處理事務?這意味着它決定何時需要鎖定記錄?

在essense - 是的,執行交易的是DBMS

的責任

2),3)...

readOnly無關與交易,這是一個提示對於Hibernate來說,Hibernate應該不會將對加載對象所做的更改傳播到數據庫(即,如果您的事務不打算將更改寫入數據庫,則可以將其指定爲性能提示)

4)何時發生提交?成功交易後或會話結束後?

提交是終止事務(另一個此類操作是回滾)的操作,因此它發生在事務結束時。

5)何時啓動hibernate會話?每個會話(服務器和客戶端之間)還是每個事務?

默認情況下 - 對於每個事務,除非您配置了「在視圖中打開會話」支持。

6)到底誰負責交易管理?春天或MySQL或兩者?

數據庫提供事務行爲的實現。 Spring通過定義邊界並觸發提交/回滾來管理事務。

+0

謝謝! :-)所以鎖定記錄是mySQL的責任,讀取datarecords不會導致鎖定?即使「只讀」與交易沒有任何關係,這意味着在此交易過程中數據記錄不會被鎖定,因爲閱讀不會導致鎖定? – nano7 2011-04-13 14:28:02

+0

@ nano7:鎖定等實現細節取決於數據庫引擎,我不確定InnoDB如何處理它。 – axtavt 2011-04-13 14:31:36

+0

好的,謝謝! :-) – nano7 2011-04-13 14:32:21

相關問題