【问题标题】:@Transactional continues at exception handling@Transactional 继续进行异常处理
【发布时间】:2015-01-03 03:02:43
【问题描述】:

我遇到了一些奇怪的问题..

假设:

@RequestMapping(value = "/do", method = RequestMethod.POST)
public void do() {
   try {
      Float x = 200;
      Float y = 100;

      TestObject x = new TestObject(x, y);
      x.setX(50);

      if (x.getX() > x.getY())
         testService.save(x);
      else
         throw new Exception("ERROR");
   } 
   catch (Exception e) {
      errorsService.save(e);
   }
}

save 方法都标记为@Transactional

问题:一旦代码抛出异常 - errorsService.save(e); 进行提交 - 添加 50 作为 x 值 TestObject。我试图声明@Transactional(rollbackFor = Exception.class) - 没有成功。始终提交,不回滚!

在所有其他方法中,交易没有任何问题 - 一切正常!

有什么建议吗?提前谢谢!

【问题讨论】:

  • 异常的堆栈跟踪是什么?扔到哪里去了?
  • 我是手动做的,我猜是这个问题
  • 你为什么不回答这个问题?
  • @JBNizet 请看一下代码。它会手动抛出错误。无论如何,没有任何堆栈跟踪,因为我只需要它来签名 - 如果抛出异常,那么我必须以单独的方式处理它

标签: java hibernate spring-mvc spring-transactions


【解决方案1】:

要回滚事务,需要从 @Transactional 方法内部抛出异常,这在您的情况下不会发生。

【讨论】:

  • 似乎是..你能告诉我如何实现它吗?基本上我是用布尔标志做的,但有例外它看起来更好))
  • @nKognito 如果您打算回滚,为什么要在 catch 块中调用 save() ,因此什么也不做?只需删除 else 块和 catch 块,你就会得到你想要的:如果x.getX() <= x.getY() 什么都不会发生。
  • 我注意在数据库中保存异常,这就是我这样做的原因)
猜你喜欢
  • 1970-01-01
  • 2019-09-05
  • 2010-09-13
  • 2015-07-26
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 2012-11-25
相关资源
最近更新 更多