【问题标题】:Spring: how to rollback declarative transactionSpring:如何回滚声明性事务
【发布时间】:2016-01-03 02:13:49
【问题描述】:

在这个例子中,如果条件得到验证,我不知道如何回滚事务。这是一个使用 JPA + Hibernate 实现持久性的 Spring MVC 应用程序

在购物车控制器中:

@RequestMapping(value="/buy",method=RequestMethod.POST)
  public String buy(){
  CartDAO.buy();
  return "redirect:/";
 }//buy

在购物车DAOImpl 中

@Transactional
public class CartDAOImpl implements CartDAO {

@PersistenceContext
private EntityManager em;

public void buy(){
 ....
 if(x !=y) throw new MyException();
 em.persist(Item);
 ....
}
}

在 applicationContext-servlet.xml 中

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

这个问题的最佳解决方案是什么?对不起我的英语

【问题讨论】:

    标签: spring hibernate spring-mvc jakarta-ee jpa


    【解决方案1】:

    来自关于回滚声明性事务的 Spring 文档:

    在其默认配置中,Spring Framework 的事务基础结构代码仅在运行时、未经检查的异常情况下将事务标记为回滚;也就是说,当抛出的异常是 RuntimeException 的实例或子类时。 (错误也将 - 默认情况下 - 导致回滚)。从事务方法抛出的检查异常不会导致默认配置回滚。

    您可以准确配置哪些异常类型将事务标记为回滚,包括检查的异常。以下 XML sn-p 演示了如何为已检查的、特定于应用程序的异常类型配置回滚。

    来源:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html#transaction-declarative-rolling-back

    【讨论】:

    • 如果我在 ApplicationContext-servlet.xml 中插入 PersistenceExceptionTranslationPostProcessor,是否未选中 MyException?
    • 选中/未选中是 Java 中的异常类型,请参阅 docs.oracle.com/javase/tutorial/essential/exceptions/…
    • 我知道这些类型的异常。但我不知道如何强制回滚。
    • 文档不是很清楚吗?你只需要抛出一个未经检查的异常。 MyException 的代码是什么?
    • 你是指状态码还是类码? @ResponseStatus(value=HttpStatus.NOT_FOUND, reason="项目数量数据库终止") public class MyException extends RuntimeException { }
    【解决方案2】:

    您可以在@Transactional 中声明您希望Spring 在您的MyException 被抛出时执行回滚:

    @Transactional(rollbackFor=MyException.class)
    

    【讨论】:

    • @ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Item数量在数据库中终止") public class MyException extends RuntimeException { } .对吗?
    • 如我所述,如果您在@Transactional 中明确声明RuntimeException,则您不需要扩展RuntimeException
    • 所以,我只删除“扩展 RuntimeException”? @ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Item数量在数据库中终止") public class MyException extends { } .
    • 异常必须扩展 Throwable
    • @Alex 当然,您的 MyException 必须是一个例外。试试MyException extends Exception
    猜你喜欢
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2011-04-17
    • 2011-11-21
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    相关资源
    最近更新 更多