【问题标题】:Transaction RollBack after catching exception捕获异常后事务回滚
【发布时间】:2015-03-02 20:04:55
【问题描述】:

有没有办法在使用声明性事务管理捕获异常后回滚事务。我有这段代码。

@Component
@Transactional(rollbackFor = EvictionException.class)
Public class Eviction{

@Autowired
private Alerter alerter;

@Scheduled(cron = "${evictor.cron.expression}")
public void evictObjectFromDatabase(){
try{
   ....
   DO SOME DELETION QUERIES
}catch(Exception ex){
   alerter.produceAlert("Failed to delete entries from database");
}
}
}

如果在删除时产生异常,我需要发出警报,让另一个团队监控摆动 UI。我还需要回滚事务,但使用 rollBackFor = Exception.class 不起作用。

【问题讨论】:

  • 你把这个标有@Transactional的EvictionException扔到哪里来进行回滚?
  • 您可以使用 throws 将异常从方法中抛出,或者这不是一个选项吗?
  • 有什么方法可以回滚事务而不会重新抛出异常

标签: java spring transactions


【解决方案1】:

您需要使用 @Transactional(rollbackFor = Exception.class) 注释您的方法并在 catch 块中抛出异常(以便事务代理可以检测到异常并因此回滚)例如

try{
   ....
   DO SOME DELETION QUERIES
}catch(Exception ex){
   alerter.produceAlert("Failed to delete entries from database");
   throw ex;// this is important
}

【讨论】:

  • Tnx 供您输入我想知道的另外一件事是,如果我从这里抛出异常,它将记录在我的日志文件中。如果发生许多此类异常,它将填满我的日志,是否有任何解决方法,使我的异常未记录在我的日志文件中
  • 我尝试使用 @Transactional(rollbackFor = Exception.class) 进行注释并使用 throw ex。它恢复了我的交易。然后我尝试不使用 @Transactional(rollbackFor = Exception.class) 并使用 throw ex,它也恢复了我的事务。那么使用 rollbackFor 有什么意义呢?在这里感到困惑:(
  • @AmbujJauhari 不同之处在于,如果您抛出自定义异常,例如throw new FooException() 然后只有 @Transactional(rollbackFor = Exception.class) 可以工作,因为 Spring 事务回滚遵循 EJB 约定
  • @AmbujJauhari 您可以创建自己的自定义异常并在 throw 子句中使用它,然后您可以配置您的日志框架以将这些异常记录在不同的日志文件中,或者如果您不想记录任何内容然后可能会配置您的日志记录框架以将它们从日志记录中排除,但我个人更喜欢首先将日志记录异常处理为单独的文件。
  • @solme 不同之处在于,如果您抛出自定义异常,例如throw new FooException() 然后只有 @Transactional(rollbackFor = Exception.class) 将起作用,因为 spring 事务回滚遵循 EJB 约定。这是部分正确的。如果您的客户异常从异常扩展,那么您必须提供回滚属性,但如果它扩展从运行时异常并且您从 catch 块中将其抛出,则无需提供 rollbackfor 属性
【解决方案2】:

@Ambuj Jauhari 如果您查看@transactional 的文档,则会发生错误或运行时异常的回滚。当您没有为异常提供回滚时,很可能会发生回滚 .class 因为抛出的异常是运行时异常而不是任何已检查异常。如果抛出的异常类型是任何已检查异常,那么如果您没有为 exception.class 属性提供回滚,则不会发生回滚

【讨论】:

    【解决方案3】:

    使用 SqlTransaction 和 RollBack

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2019-06-09
    • 2013-10-16
    • 2018-08-09
    • 2012-12-28
    • 1970-01-01
    相关资源
    最近更新 更多