@Transactional(rollbackFor)

简介: @Transactional注解有两个• 一个是spring提供的@org.springframework.transaction.annotation.Transactional• 另一个是jdk提供@javax.transaction.Transactional。

@Transactional注解有两个

  • 一个是spring提供的@org.springframework.transaction.annotation.Transactional
  • 另一个是jdk提供@javax.transaction.Transactional。

在回滚的设置上

  • spring提供的是rollbackFor
  • jdk提供的是rollbackOn

在使用方法上是一致的。

这两个注解在我有限的测试里表现是一样的。

用在哪里

@Transactional注解既可以写在方法上也可以写在类上。写在类上则这个类的所有public方法都将会有事务。这样显然会使一些不需要事务的方法产生事务,所以更好的做法是在想要添加事务的方法上标注@Transactional。

rollbackFor

@Transactional的rollbackFor用于指定能够触发事务回滚的异常类型,可以指定多个,用逗号分隔。

rollbackFor默认值为UncheckedException,包括了RuntimeException和Error.

当我们直接使用@Transactional不指定rollbackFor时,Exception及其子类都不会触发回滚。

public class BusinessException extends Exception {
    public BusinessException(String msg) {
        super(msg);
    }
}
@Autowired
    private UserRepository userRepository;
    // 不回滚
    @Transactional
    public void test1() throws Exception {
        User user = new User(1, "15000000000", "d243ewa", "Comma");
        saveUser(user);
        throw new Exception("test1 error");
    }
    // 不回滚
    @Transactional
    public void test11() throws Exception {
        User user = new User(1, "15000000000", "d243ewa", "Comma");
        saveUser(user);
        throw new BusinessException("test11 error");
    }
    // 回滚
    @Transactional(rollbackOn = Exception.class)
    public void test2() throws Exception {
        User user = new User(1, "15000000000", "d243ewa", "Comma");
        saveUser(user);
        throw new Exception("test2 error");
    }
    // 回滚
    @Transactional(rollbackOn = Exception.class)
    public void test21() throws Exception {
        User user = new User(1, "15000000000", "d243ewa", "Comma");
        saveUser(user);
        throw new BusinessException("test21 error");
    }
    // 回滚
    @Transactional
    public void test3() {
        User user = new User(1, "15000000000", "d243ewa", "Comma");
        saveUser(user);
        throw new RuntimeException("test3 runtime error");
    }
    // 不回滚
    @Transactional
    public void test4() throws Exception {
        User user = new User(1, "15000000000", "d243ewa", "Comma");
        test41(user);
        throw new Exception("test4 error");
    }
    @Transactional(rollbackOn = Exception.class)
    public void test41(User user) {
        saveUser(user);
    }
    // 不回滚
    public void test5() throws BusinessException {
        test6();
    }
    // 回滚
    @Transactional(rollbackOn = Exception.class)
    public void test6() throws BusinessException {
        User user = new User(1, "15000000000", "d243ewa", "Comma");
        saveUser(user);
        throw new BusinessException("test6 error");
    }
    // 回滚
    @Transactional(rollbackOn = Exception.class)
    public void test7() throws BusinessException {
        test8();
    }
    public void test8() throws BusinessException {
        User user = new User(1, "15000000000", "d243ewa", "Comma");
        saveUser(user);
        throw new BusinessException("test8 error");
    }
    public User saveUser(User user) {
        return userRepository.save(user);
    }
目录
相关文章
|
2月前
|
Java 编译器 数据库
@Transactional中指定rollbackFor,弊端以及不能回滚的时候
@Transactional中指定rollbackFor,弊端以及不能回滚的时候
31 3
|
2月前
|
Java 编译器 数据库
在事务注解@Transactional中指定rollbackFor
在事务注解@Transactional中指定rollbackFor
29 0
|
前端开发 Java 编译器
为啥阿里巴巴规定要在 @Transactional 指定 rollbackFor?
为啥阿里巴巴规定要在 @Transactional 指定 rollbackFor?
198 0
为啥阿里巴巴规定要在 @Transactional 指定 rollbackFor?
|
21天前
|
SQL Java 数据库
Transactional注解讲解及使用
事务是数据库操作的一组集合,它作为一个工作单元,要求所有操作要么全部成功,要么全部失败。事务的四个基本特性是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
77 2
|
2月前
|
Java 编译器 Spring
@transactional注解失效情况
@transactional注解失效情况
|
2月前
|
关系型数据库 Java MySQL
一篇文章学会使用@Transactional
一篇文章学会使用@Transactional
24 0
|
8月前
|
SQL Java 数据库连接
@Transactional
@Transactional
76 0
|
12月前
|
Java 数据库 Spring
@Transactional注解超详细
@Transactional注解超详细
583 0
|
Java 数据库 Spring
@Transactional 注解失效问题
@Transactional 注解失效问题