并发情况导致事务失效的场景
public void test(Pageable request){ for (int i = 0; i { userInfoService.testDemo(); }).start(); } }
这里创建多个线程模拟多并发场景
@Transactional(rollbackOn = Exception.class) public synchronized void testDemo() { UserInfo byUserId = userRepository.findByUserId(1); byUserId.setAge(byUserId.getAge() + 1); userRepository.save(byUserId); }
这里说一下我的理解:事务失效的原因
- 原因1:我们知道synchronized锁,锁的是调用当前方法的对象。而Spring AOP 处理事务会进行生成一个代理对象,并在代理对象执行方法前的事务开启,方法执行完的事务提交。因此这里每个线程都会创建一个代理对象,而synchronized锁的是这个代理对象,因此多少个线程就会有多少把锁,根本锁不住。所以说事务的执行,根本没有上锁。就会出现多个事务同时提交,导致数据被重复修改,结果达不到我们想要的情况(比如说这里我们修改了age字段100次,结果可能只有50)
- 原因2:因为Synchronized锁定的是当前调用方法对象,而Spring AOP 处理事务会进行生成一个代理对象,并在代理对象执行方法前的事务开启,方法执行完的事务提交,所以说,事务的开启和提交并不是在 Synchronized 锁定的范围内。出现同步锁失效的原因是:当A(线程) 执行完方法,会进行释放同步锁,去做提交事务,但在A(线程)还没有提交完事务之前,B(线程)获取锁进行执行方法,执行完毕之后和A(线程)一起提交事务, 这时候就会出现线程安全问题。
说明:为什么多线程一起提交事务就会导致数据丢失。
- 具体来说,假设你的事务是修改某一条数据记录的某个字段,如果A线程在修改完毕并提交事务之后,B线程再去修改这个字段并提交事务,这时候的流程是没有问题的。
- 但是,如果A线程刚完成修改,尚未提交事务,B线程此时也完成修改并试图提交事务,这时候就可能产生问题。因为在数据库中,提交事务通常意味着把修改写入数据库,如果两个线程同时提交事务,可能会导致两个线程前后冲突,数据被错误地覆盖。
这里粘一个gpt的回答
因此这个锁的范围,必须包含整个事务。
修改:
@GetMapping(path = "test") @ResponseBody public void test(Pageable request) { for (int i = 0; i { synchronized (UserController.class) { userInfoService.testDemo(); } }).start(); } }
这里synchronized锁整个UserController类。确保同一时间只有一个userInfoService调用testDemo方法。
@Transactional(rollbackOn = Exception.class) public void testDemo() { UserInfo byUserId = userRepository.findByUserId(1); log.info("当前线程:{},当前年龄:{}",Thread.currentThread().getName(),byUserId.getAge()); byUserId.setAge(byUserId.getAge() + 1); userRepository.save(byUserId); log.info("当前线程:{},当前年龄:{}",Thread.currentThread().getName(),byUserId.getAge()); }
如此一来,同一时间只有一个线程进入testDemo方法,一个线程提交事务。不再会出现多线程同时提交导致数据被覆盖的情况了!
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!