[关闭]
@zero1036 2019-03-08T15:17:15.000000Z 字数 1643 阅读 1500

SpringBoot事务注解@Transactional

Java-Spring


参数说明

  1. // readOnly=true只读,不能更新,删除
  2. @Transactional (propagation = Propagation.REQUIRED,readOnly=true)
  3. // 设置超时时间
  4. @Transactional (propagation = Propagation.REQUIRED,timeout=30)
  5. // 设置数据库隔离级别
  6. @Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)

注意事项

  1. 在需要事务管理的地方加@Transactional 注解。@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。
  2. @Transactional 注解只能应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,但是这个被注解的方法将不会展示已配置的事务设置。
  3. 注意仅仅 @Transactional 注解的出现不足于开启事务行为,它仅仅 是一种元数据。必须在配置文件中使用配置元素,才真正开启了事务行为。
  4. 通过 元素的 “proxy-target-class” 属性值来控制是基于接口的还是基于类的代理被创建。如果 “proxy-target-class” 属值被设置为 “true”,那么基于类的代理将起作用(这时需要CGLIB库cglib.jar在CLASSPATH中)。如果 “proxy-target-class” 属值被设置为 “false” 或者这个属性被省略,那么标准的JDK基于接口的代理将起作用。
  5. Spring团队建议在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。在接口上使用 @Transactional 注解,只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装。
  6. @Transactional 的事务开启,或者是基于接口的 或者是基于类的代理被创建。所以在同一个类中一个方法调用另一个方法有事务的方法,事务是不会起作用的。

回滚

默认遇到throw new RuntimeException("...");会回滚
捕获的throw new Exception("...");不会回滚

需要捕获Exception回滚方法:rollbackFor = Exception.class

手动回滚方法:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

  1. @Transactional(propagation = Propagation.REQUIRES_NEW,
  2. rollbackFor = Exception.class, isolation = Isolation.REPEATABLE_READ)
  3. public void testInsert(int index) throws Exception {
  4. OrderDO orderDO = new OrderDO();
  5. orderDO.setThirdOrderId("1000");
  6. int rowCount = this.orderMapper.insertOrder(orderDO);
  7. if (index == 1) {
  8. throw new RuntimeException("wrong");
  9. }
  10. if (index == 2) {
  11. throw new Exception("wrong");
  12. }
  13. if (index == 3) {
  14. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  15. }
  16. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注