EJB-2.0事务回滚是撤消/恢复数据库更改吗?

时间:2016-01-22 05:50:37

标签: java database java-ee ejb rollback

假设我在 ejb bean方法中编写了一些与事务相关的代码,如下所示:

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。 BEGIN:开始我的交易后utx.begin();
更改了java变量status = 1;
更改了数据库( SEGMENT-1 )。例如DB上的一些INSERT和UPDATE
然后执行其他一些计算( SEGMENT-2

2。 COMMIT:现在提交utx.commit()之前一些异常出现在( SEGMENT-2

3。 ROLLBACK:因此catch块捕获异常( SEGMENT-3 )并执行事务回滚utx.rollback()

我的问题:
utx.rollback()回滚是否所有数据库更改和java变量都发生了变化?
只有数据库更改
OR 只回滚java变量?

2 个答案:

答案 0 :(得分:1)

将回滚utx.begin()之后所做的所有数据库更改。

utx.rollback()对您的java变量没有影响。

答案 1 :(得分:0)

我想扩展 Steve C 的回答

另一个要点是,如果我们创建了任何数据库级别 COMMIT ,那么这些更改永远不会被EJB utx.rollback()回滚。

例如,如果我们执行

stmt.executeUpdate("COMMIT");

或者在调用的任何包或存储过程中显式执行COMMIT 然后发生数据库级别提交。