2016-01-22 83 views
0

假設我在EJB bean方法寫了一些交易相關的代碼如下:EJB-2.0事務回滾是撤銷還是恢復數據庫更改?

UserTransaction utx = sessionContext.getUserTransaction(); 
try { 
    int status = 0; 
    utx.begin(); 
    status = 1; 
    //SEGMENT- 1: UPDATE DATABASE 

    //SEGMENT- 2: SOME OTHER CODE - which may throw Exception 

    utx.commit(); 
} catch (Exception e) { 
    utx.rollback();//SEGMENT- 3: My QUESTION at here, is it bollbak DATABASE changes also? 
        // OR only rollback value of variable 'status' to '0' 
    e.printStackTrace(); 
} 

1.開始:開始我的交易utx.begin();
更改Java變量status = 1;
更改數據庫後(SEGMENT-1)。例如一些INSERT和UPDATE在DB
然後執行一些其他的計算(SEGMENT- 2

2. COMMIT:現在提交utx.commit()
之前有些異常發生在(SEGMENT- 2

3 。ROLLBACK:所以catch塊捕獲異常(SEGMENT-3)並執行事務回滾utx.rollback()

我的問題:
utx.rollback()回滾
所有數據庫的更改和Java變量的變化?
OR 僅備份數據庫更改
OR只有回滾Java變量的變化?

+1

內存不是事務性的,所以變量值不會被改變。您需要在'catch'塊中手動執行。 – slwk

+0

@slwk - 是** utx.rollback()**撤消在事務期間進行的數據庫更改。 – mmuzahid

回答

1

根據utx.begin()所做的所有數據庫更改都將被回滾。

utx.rollback()對你的java變量沒有影響。

0

我想延長史蒂夫ç的回答

另外重要的一點是,如果我們所做的任何數據庫級別COMMIT則不會被EJB utx.rollback()回滾這些更改。

例如,如果我們執行

stmt.executeUpdate("COMMIT"); 

或者執行COMMIT明確地被稱爲 然後數據庫級別提交發生任何包裝或存儲過程中。