【问题标题】:No rollback for ConstraintViolationException in transactional service事务服务中的 ConstraintViolationException 没有回滚
【发布时间】:2012-12-08 12:57:11
【问题描述】:

我有一个名为add() 的服务方法,它带有@Transactional 注释。

我调用它,但是当在相应的 DAO 方法中发生 ConstraintViolationException 时,即使我指定不回滚,它也会回滚事务。

我希望 ConstraintViolationException 被捕获,而不是 NotFoundException 已检查异常将被抛出。

@Override
@Transactional(noRollbackFor = ConstraintViolationException.class)
public User add(User user) throws NotFoundException {
    try {
        result = userDao.add(user);
    } catch (RuntimeException e) {
        throw new NotFoundException("Couldn't find group");
    }
}

有没有办法在不回滚事务的情况下捕获ConstraintViolationException

我使用的是 spring 3.1.1 和 hibernate 3.6。

【问题讨论】:

  • 您指定不应回滚 ConstraintViolationException。但是抛出的异常是 NotFoundException。由于它是一个检查异常,它不应该导致回滚默认情况下。但这一切都取决于您如何配置 Spring 事务管理器。
  • 我想捕获ConstraintViolationException并抛出NotFoundException但是catch块没有捕获它,我认为它可能在到达catch块之前被代理捕获,所以ConstraintViolationException上升并且事务回滚!跨度>

标签: spring rollback transactional


【解决方案1】:

啊,我知道会发生什么。 ConstraintViolationException 发生在提交时,在方法执行之后,当您的 add() 方法周围的事务拦截器尝试提交事务时。由于它不能提交,显然,事务被回滚。它不能用于其他任何东西。

【讨论】:

  • 感谢您的回复,是的,我认为应该是这样。
  • 嗨@JB Nizet,所以你的意思是,如果在提交时发生异常,你能做些什么来阻止它?就像财产 noRollbackFor 没有任何权力阻止它?我遇到了类似的情况,我试图捕获 ObjectOptimisticLockingFailureException。 ——
猜你喜欢
  • 1970-01-01
  • 2020-04-28
  • 2020-10-29
  • 2010-09-30
  • 2018-06-17
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 2021-12-13
相关资源
最近更新 更多