是否有更简单的方法将@Transactional与日志记录结合起来?

时间:2011-08-01 19:00:14

标签: java spring

我第一次尝试使用Spring但是遇到了@Transactional的问题。我的应用程序的某些部分需要在方法中记录异常,而不是将它们冒泡到,例如main()。但问题是,如果发生异常,那些标有@Transactional的方法将不会回滚。

简而言之,这不会起作用

@Transactional
public void doStuff() {
    try {
        //Do something that might cause an Exception
    } catch (Exception e) {
        log.error("Exception when trying to do stuff", e);
    }
}

因为根据我的理解,如果发生异常,事务将永远不会回滚。

我能提出的唯一解决方案:

public void doStuff() {
    try {
        doStuff0();
    } catch (Exception e) {
        log.error("Error encountered while attempting to join servers", e);
    }
}

@Transactional
protected void doStuff0() {
    //Do something that might cause an Exception
}

虽然这很难看,使用了我不喜欢的模式,在这个例子中几乎是代码的两倍。

是否有其他替代方法可以记录异常并回滚事务?

2 个答案:

答案 0 :(得分:1)

实际上有一种简单的方法可以做你想要的。建筑宇航员讨论它是否是一个好主意或何时适合放在一边,有时你只需要它工作:):

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

这很容易。

答案 1 :(得分:0)

只需重新抛出异常:

@Transactional
public void doStuff() {
    try {
        //Do something that might cause an Exception
    } catch (Exception e) {
      log.error("Exception when trying to do stuff", e);
      throw e;
    }
}