同一个类或者两个分别不同的类中a方法调用b方法事务的隔离级别问题

本文讨论了在同一个类内以及不同类之间,如BookService和MultService,调用方法时如何处理事务的隔离级别问题,特别是与MySQL数据库交互的场景。
摘要由CSDN通过智能技术生成

同一个类中BookService: 

buyBook方法(a)updatePrice方法(b)两个方法是否报错现象
transactional不加注解a报错 b不报错a,b事务回滚
transactional不加注解b报错 a不报错a,b事务回滚
不加注解transactionala报错   b不报错 a,b事务都不回滚
不加注解transactionalb报错   a不报错a,b事务都不回滚


两个类BookService              MultService两个类:

buyBook方法(a)updatePrice方法(b)两个方法是否报错现象
transactional不加注解a报错 b不报错a,b事务回滚
transactional不加注解b报错 a不报错a,b事务回滚
不加注解transactionala报错   b不报错 a,b事务都不回滚
不加注解transactionalb报错   a不报错 a不回滚,b回滚

 

假设有一个名为 `UserService` 的服务,其两个方法 `addUser` 和 `deleteUser`,都被 `@Transactional` 注解修饰: ```java @Service public class UserService { @Autowired private UserRepository userRepository; @Transactional public void addUser(User user) { userRepository.save(user); } @Transactional public void deleteUser(Long userId) { userRepository.deleteById(userId); // 模拟异常 int i = 1 / 0; } } ``` 假设在另一个方法同时调用了 `addUser` 和 `deleteUser` 方法: ```java @Service public class TestService { @Autowired private UserService userService; @Transactional public void test() { User user = new User(); user.setUsername("test"); user.setPassword("123456"); userService.addUser(user); userService.deleteUser(user.getId()); } } ``` 由于 `test` 方法被 `@Transactional` 注解修饰,所以整个方法应该运行在一个事务内。但是,由于 `addUser` 和 `deleteUser` 方法都被 `@Transactional` 注解修饰,它们将在自己的独立事务运行,并且在 `deleteUser` 方法抛出异常时,只会回滚 `deleteUser` 方法内的事务,而不会回滚 `test` 方法内的事务。这意味着 `addUser` 方法执行成功后的数据将被提交到数据库,而 `deleteUser` 方法执行失败后的数据将不会被回滚,导致数据不一致。因此,在同一个类中调用被 `@Transactional` 注解修饰的方法时,需要注意事务传播机制和事务隔离级别的设置,以避免出现意外情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值