1-Transactional注解简介

常用方式

  • 可以在类上,接口上进行使用,但是不建议这么使用,这样影响的范围太大。
  • 默认只对非检查异常和error进行回滚,对检查性异常不进行回滚。使用rollbackFor属性可以指定当发生检查性异常的时候发生回滚。
  • 可以在testcase上进行使用,但是默认会回滚。

验证非坚持异常不会回滚

非检查性异常发生不会进行回滚

    @Transactional
    @Override
    public void checkExceptionMethod() throws IOException {
        User user= User.builder()
                .id(4)
                .passWord("122")
                .userName("hello")
                .realName("realname")
                .build();
        userMapper.insertOne(user);
            File file=new File("");
            file.createNewFile();
    }

而如果指定rallbackFor的值则会进行回滚

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void checkExceptionMethod() throws IOException {
        User user= User.builder()
                .id(4)
                .passWord("122")
                .userName("hello")
                .realName("realname")
                .build();
        userMapper.insertOne(user);
            File file=new File("");
            file.createNewFile();
    }

如果发生异常,并且使用try...catch进行捕获,这时候是否会发生回滚呢?

@Transactional(rollbackFor = Exception.class)
    @Override
    public void checkExceptionMethod() throws IOException {
        User user= User.builder()
                .id(4)
                .passWord("122")
                .userName("hello")
                .realName("realname")
                .build();
        userMapper.insertOne(user);
        try {
            File file=new File("");
            file.createNewFile();
        } catch (IOException e) {
            System.out.println("发生异常");
        }
    }

进过测试,当使用try...catch进行包裹异常的时候,不会发生回滚

在TestCase上使用

/**
 * 1. 只有@Test,不会进行回滚
 * 2. 如果在单元测试上加上@Transactional会回滚
 * 3. 如果不想让单元测试进行回滚,使用@Rollback注解,并且value=false这样就可以让
 * 单元测试提交事务。
 */
@Rollback(value = false)
@Transactional
@Test
public void testInsertOne(){
    User user= User.builder()
            .id(3)
            .passWord("122")
            .userName("hello")
            .realName("realname")
            .build();
    userMapper.insertOne(user);
}

github仓库,地址为:

https://github.com/bulingfeng/spring-cloud-demo/tree/master/spring-transactional-demo
posted @ 2022-06-27 14:51  bulingfeng  阅读(43)  评论(0编辑  收藏  举报