spring中@Transactional注解的作用,使用场景举例

一,spring中管理事务一般使用@Transactional  注解,下面对@Transactional 使用的各个场景做一个列举,尽可能的将所有场景罗列出来

1,场景一,最常见的用法,在方法上使用@Transactional  注解,事务正常起作用。无异常时正常提交,有异常时数据回滚,代码如下。

@Service
public class ComeServiceImpl implements ComeService {
    @Autowired
    UserMapper userMapper;

    @Override
    @Transactional
    public int saveUser() {
        User user1 = new User(11,"a",111,"a");
        userMapper.saveUser(user1);
//        int i = 1 / 0;
        User user2 = new User(11,"b",111,"b");
        userMapper.saveUser(user2);
        return 0;
    }
}

2,场景二,常见的用法,在类上使用@Transactional  注解,对整个类的方法,事务起作用。无异常时正常提交,有异常时数据回滚,代码如下。

@Service
@Transactional
public class ComeServiceImpl implements ComeService {
    @Autowired
    UserMapper userMapper;
    @Override
    public int saveUser() {
        User user1 = new User(11,"a",111,"a");
        userMapper.saveUser(user1);
        User user2 = new User(11,"b",111,"b");
        userMapper.saveUser(user2);
        // int i = 1 / 0;
        return 0;
    }
}

3,场景三,将异常信息使用try-catch 包裹,异常被处理,@Transactional 注解不起作用,数据提交,没有回滚,代码如下。

@Service
@Slf4j
public class ComeServiceImpl implements ComeService {
    @Autowired
    UserMapper userMapper;
    @Override
    @Transactional
    public int saveUser() {
        User user1 = new User(11,"a",111,"a");
        userMapper.saveUser(user1);
        User user2 = new User(11,"b",111,"b");
        userMapper.saveUser(user2);
        try {
            int i = 1 / 0;
        }catch (Exception e){
            System.out.println("异常。。。");
        }
        return 0;
    }
}

4,场景四,同一个Service内方法调用,当@Transactional 注解作用在A方法上时,事务起作用。方法A中的数据回滚,方法B中的数据回滚,代码如下。

@Service
@Slf4j
public class ComeServiceImpl implements ComeService {
    @Autowired
    UserMapper userMapper;
    @Override
    @Transactional
    public int A() {
        User user1 = new User(11,"a",111,"a");
        userMapper.saveUser(user1);
        this.B();
        return 0;
    }

    @Override
    public int B() {
        User user2 = new User(11,"b",111,"b");
        userMapper.saveUser(user2);
        int i = 1 / 0;
        return 0;
    }
}

5,场景五,同一个Service内方法调用,当@Transactional 注解作用在B方法上时,事务不起作用。方法A中的数据提交,方法B中数据提交,遇到异常没有回滚,代码如下。

@Service
@Slf4j
public class ComeServiceImpl implements ComeService {
    @Autowired
    UserMapper userMapper;
    @Override
    public int A() {
        User user1 = new User(11,"a",111,"a");
        userMapper.saveUser(user1);
        this.B();
        return 0;
    }

    @Override
    @Transactional
    public int B() {
        User user2 = new User(11,"b",111,"b");
        userMapper.saveUser(user2);
        int i = 1 / 0;
        return 0;
    }
}

6,场景六,同一个Service内方法调用,当@Transactional 注解作用在类上时,事务起作用,数据回滚,代码如下。

@Service
@Slf4j
@Transactional
public class ComeServiceImpl implements ComeService {
    @Autowired
    UserMapper userMapper;
    @Override
    public int A() {
        User user1 = new User(11,"a",111,"a");
        userMapper.saveUser(user1);
        this.B();
        return 0;
    }

    @Override
    public int B() {
        User user2 = new User(11,"b",111,"b");
        userMapper.saveUser(user2);
        int i = 1 / 0;
        return 0;
    }
}

7,场景七,同一个Service内方法调用私有的方法C,当@Transactional 注解作用在方法A上时,事务起作用,数据回滚,代码如下。

@Service
@Slf4j
public class ComeServiceImpl implements ComeService {
    @Autowired
    UserMapper userMapper;
    @Override
    @Transactional
    public int A() {
        User user1 = new User(11,"a",111,"a");
        userMapper.saveUser(user1);
        this.C();
        return 0;
    }
    private int C() {
        User user2 = new User(11,"b",111,"b");
        userMapper.saveUser(user2);
        int i = 1 / 0;
        return 0;
    }
    @Override
    public int B() {
        return 0;
    }
}

8,场景八,同一个Service内方法调用私有的方法C,当@Transactional 注解作用在方法C上时,事务不起作用,方法A中的数据提交,方法C中的数据提交,代码如下。

@Service
@Slf4j
public class ComeServiceImpl implements ComeService {
    @Autowired
    UserMapper userMapper;
    @Override
    public int A() {
        User user1 = new User(11,"a",111,"a");
        userMapper.saveUser(user1);
        this.C();
        return 0;
    }
    @Transactional
    private int C() {
        User user2 = new User(11,"b",111,"b");
        userMapper.saveUser(user2);
        int i = 1 / 0;
        return 0;
    }
    @Override
    public int B() {
        return 0;
    }
}

9,场景九,不同Service方法间调用,当@Transactional 注解作用在方法A上时,事务起作用,方法A中的数据回滚,方法saveClassInfo中的数据回滚,代码如下。

@Service
@Slf4j
public class ComeServiceImpl implements ComeService {
    @Autowired
    UserMapper userMapper;
    @Autowired
    ClassInfoService classInfoService;

    @Override
    @Transactional
    public int A() {
        User user1 = new User(11,"a",111,"a");
        userMapper.saveUser(user1);
        classInfoService.saveClassInfo();
        return 0;
    }
    @Override
    public int B() {
        return 0;
    }
}
@Service
public class ClassInfoServiceImpl implements ClassInfoService {
    @Autowired
    ClassInfoMapper classInfoMapper;

    @Override
    public int saveClassInfo() {
        ClassInfo classInfo = new ClassInfo("c","c",69D);
        classInfoMapper.saveClassInfo(classInfo);
        int i = 1/0;
        return 0;
    }
}

10,场景十,不同Service方法间调用,当@Transactional 注解作用在方法saveClassInfo上时,事务对A不起作用,方法A中的数据提交,方法saveClassInfo数据回滚,代码如下。

@Service
@Slf4j
public class ComeServiceImpl implements ComeService {
    @Autowired
    UserMapper userMapper;
    @Autowired
    ClassInfoService classInfoService;

    @Override
    public int A() {
        User user1 = new User(11,"a",111,"a");
        userMapper.saveUser(user1);
        classInfoService.saveClassInfo();
        return 0;
    }
    @Override
    public int B() {
        return 0;
    }
}
@Service
public class ClassInfoServiceImpl implements ClassInfoService {
    @Autowired
    ClassInfoMapper classInfoMapper;

    @Override
    @Transactional
    public int saveClassInfo() {
        ClassInfo classInfo = new ClassInfo("c","c",69D);
        classInfoMapper.saveClassInfo(classInfo);
        int i = 1/0;
        return 0;
    }
}

未完待续。。。。持续更新

  • 49
    点赞
  • 167
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Spring Boot ,`@Transactional` 注解用于标记一个方法或类需要在事务控制下执行。它可以应用于方法级别或类级别,用于控制数据库事务的提交和回滚。 下面是一个示例来说明 `@Transactional` 注解使用: ```java @Service public class UserService { @Autowired private UserRepository userRepository; @Transactional public void createUser(User user) { userRepository.save(user); } @Transactional(readOnly = true) public User getUserById(Long id) { return userRepository.findById(id).orElse(null); } } ``` 在上述示例,我们使用 `@Transactional` 注解来标记了两个方法:`createUser` 和 `getUserById`。 对于 `createUser` 方法,当该方法被调用时,会启动一个事务,并在方法执行完成后,自动提交事务。如果该方法的任何操作抛出异常或运行时异常,事务将会回滚,确保数据的一致性。 对于 `getUserById` 方法,我们使用 `@Transactional(readOnly = true)` 注解来标记它为只读事务。这意味着在该方法,我们只能读取数据,而不能进行更新操作。只读事务可以提高性能,因为它们不需要对数据进行锁定和回滚。 需要注意的是,`@Transactional` 注解默认情况下会应用于 public 方法。如果想要在非 public 方法上使用 `@Transactional` 注解,需要确保开启了相应的代理模式。可以通过在 Spring Boot 的配置文件设置 `spring.aop.proxy-target-class=true` 来开启基于类的代理模式。 总之,通过在方法或类上添加 `@Transactional` 注解,可以实现对数据库事务的管理,保证数据的一致性和完整性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值