2010-09-23 33 views

回答

0

Hibernate有TransactionFactory

一個抽象工廠Transaction實例。具體實現由hibernate.transaction.factory_class指定。

它具體實現:JDBCTransactionFactory,JTATransactionFactory,CMTTransactionFactory。這些工廠創建一個Transaction的實例 - 例如JDBCTransaction

然後,我不能告訴你的JTA和CMT會發生什麼,但對於JDBC是如設置爲簡單的自動提交爲false(當你調用開始事務):

connection.setAutoCommit(false); 

分別在transaction.commit()connection.commit()

如果與會話操作時出現任何異常,它調用connection.rollback()

+0

這又如何回答OP的問題嗎? – talonx 2010-10-02 01:03:32

+0

@talonx這個問題最初是關於hibernate的。我的答案解釋了它 - 它顯示_how_事​​務處理已經實現。由於EJB可以像JPA提供的那樣使用Hibernate,我認爲它是正確的。你不喜歡哪部分? – Bozho 2010-10-02 06:40:16

+0

感謝澄清。也許OP已經編輯了這個問題,因爲我沒有看到任何對Hibernate的引用 - 在這種情況下,它不是Hibernate特有的問題。 – talonx 2010-10-02 07:44:18

8

Hibernate不實現 TRAN它依賴幷包裝JDBC事務或JTA事務(容器管理或應用程序管理)。

關於EJB的,如果你想了解一個JTA事務管理的細節,你需要能流暢使用JTA接口UserTransactionTransactionManager,並XAResource這在JTA specification描述。 JDBC API Tutorial and Reference, Third Edition對於理解JDBC驅動程序的XA部分也很有用。然後,獲取EJB容器(如JBoss)或獨立JTA事務管理器(如Atomikos)的源代碼來分析TM部分。還有祝你好運。

+0

感謝您的回答。我正在談論EJB或任何JTA實現中的Transaction實現。 – 2010-09-29 07:16:04

+0

我非常抱歉,我的瀏覽器中有一個JavaScript錯誤,我已經提出了您的答案。 – 2010-09-29 07:28:23

+0

@Suresh好吧,沒問題。但我必須承認,我很驚訝,因爲1.我的回答沒有任何問題2.我覺得在你自己的問題上回答問題很難。如果是錯誤,請隨時恢復。 – 2010-09-29 07:38:34

1

EJB in Action從書

常用於實現多個資源的協議是兩階段提交。兩階段提交協議在最終提交之前執行額外的準備步驟。 涉及的每個資源管理器被詢問當前事務是否可以成功提交。如果任何一個資源管理器指示如果嘗試該事務不能被提交,則整個事務被放棄(回滾)。否則,允許事務繼續進行,並要求所有資源管理器提交。

資源管理器可以是一個數據庫,例如。其他例子包括消息服務。協調事務的組件稱爲事務管理器。

假設您有一個應用程序,其中涉及兩個區別數據庫。事務管理器如何通過使用兩階段提交協議來執行其工作?

  1. 事務管理器問數據庫1,如果它可以提交當前事務
  2. 如果是的話,問數據庫2,如果它可以提交當前事務
  3. 事務管理器要求數據庫1提交
  4. 事務管理問數據庫2提交

休眠構建在JDBC API之上。它只是協調一個數據庫。所以,如果你

session.commit(); 

在幕後,它叫

connection.commit(); 

如果你真的想學習的內部事務,我的建議是Java Transaction Processing書。

4

這個問題可以在很多層面上得到答案。

發生了什麼事情的一般討論可以發現here

我的總結是這樣的...首先,什麼地方必須有一個事務協調,EJB容器會了解協調員 - 通常這部分應用程序服務器。所以EJB容器所要做的就是致電

someobject.BeginTransaction() 

就是這樣。 EJB容器使用的實際API是JTA。 EJB實際上可以使用Bean Managed事務事務或Container管理事務。在Bean Managed案例中,實施者不想做JTA調用。通常我們使用容器管理的事務(CMT)。在這種情況下,容器具有在實現達到之前運行的邏輯。例如:

if (we're not already in a transaction) 
    begin transaction 

call the EJB implementation 

和後來的容器具有邏輯

if (finished processing request) 
    commit transaction 

與其它路徑中止事務如果錯誤發生。

現在,邏輯更加複雜,因爲CMT EJB使用事務控制語句註釋。例如,你可以說「如果我們已經有一個事務,就使用它」所以如果一個EJB調用另一個EJB,那麼只有一個事務被使用。爲此閱讀EJB規範。

但是,在Java EE EJB的任何寫入過程中,這一切都非常明顯。所以我懷疑你要問moe 裏面的 JTA調用,事務管理器是如何實現的以及它與事務資源管理器(如數據庫)的關係。這是一個巨大的話題。您實際上已經在那裏實施了分佈式事務協議XA。坦率地說,我懷疑你確實需要知道這一點。在某些時候,您已經信任您正在使用的API。但是有一個關鍵的細節:你的事務管理器(通常是App Server本身)必須能夠告訴REsource Managers任何給定事務的命運,並且該信息必須在應用服務器的重啓之後存在,因此某些持久存儲的事務信息必須保持。您會在某處找到事務日誌,並且在設置App Server時需要確保這些日誌得到良好的關注。

+1

+1,用於提及XA,因爲它是J2EE事務服務的常用基本協議。還應該注意的是,JTA是一個接口規範 - 它由其他人(Wbelogic,Websphere,Oracle,JBOSS等)提供實際實現。 – 2010-10-04 01:38:37

+0

「實施者」是JTS嗎?當我通過網絡閱讀時,JTA就像JDBC API(類比)那樣是「規範」。在JTA的情況下,我已經閱讀了兩個術語:JTA,JTS,JTS是如何實現JTA的? – CuriousMind 2014-11-03 14:11:47

+0

不,JTS關注JTA下的一些實現細節,嚴格地說JTA實現可能不使用JTS,JEE規範建議但不要求使用JTS。 JTS是CORBA事務規範OTS的實現,涉及資源管理器和事務管理器之間的通信。很顯然,如果JTA實施使用JTS,那麼很可能會找到其他說明該協議的資源管理器,因此JEE建議使用它。 – djna 2014-11-03 14:45:36