首页 > 其他分享 >并发情况导致事务失效的场景

并发情况导致事务失效的场景

时间:2024-07-19 11:30:20浏览次数:12  
标签:事务 场景 testDemo 修改 并发 线程 byUserId 提交 失效

public void test(Pageable request){
    for (int i = 0; i < 100; i++) {
        //新建线程处理
        new Thread(() -> {
            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 < 100; i++) {
        //新建线程处理
        new Thread(() -> {
            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方法,一个线程提交事务。不再会出现多线程同时提交导致数据被覆盖的情况了!

标签:事务,场景,testDemo,修改,并发,线程,byUserId,提交,失效
From: https://blog.csdn.net/qq_64064246/article/details/140522929

相关文章

  • 论如何直接用EF Core实现创建更新时间、用户审计,自动化乐观并发、软删除和树形查询(中)
    前言数据库并发,数据审计和软删除一直是数据持久化方面的经典问题。早些时候,这些工作需要手写复杂的SQL或者通过存储过程和触发器实现。手写复杂SQL对软件可维护性构成了相当大的挑战,随着SQL字数的变多,用到的嵌套和复杂语法增加,可读性和可维护性的难度是几何级暴涨。因此如何在实......
  • Spring事务失效场景详细总结(下)
    1.错误的传播特性        其实,我们在使用@Transactional注解时,是可以指定propagation参数的。 该参数的作用是指定事务的传播特性,spring目前支持7种传播特性:REQUIRED 如果当前上下文中存在事务,那么加入该事务,如果不存在事务,创建一个事务,这是默认的传播属性值。......
  • 聊聊测试用例编写方法及适用场景
    有过一定测试理论基础的从业者,对测试用例编写方法基本上可以张口就来,什么等价类划分法,边界值分析法,因果图法,场景设计法,错误猜测法等。这篇文章主要聊聊等价类划分,边界值分析法两个使用频率稍微较高的测试用例编写方法和适用场景。等价类划分法:是一种常用的黑盒测试技术,用于减......
  • MMU和SMMU IOMMU使用场景和区别,SMMU技术与cache
    1.各种MMUMMU是memorymanageunit内存管理单元;SMMU是systemmemorymanageunit系统内存管理单元;IOMMU和SMMU的功能基本相同,只是不同厂商的叫法2.各种MMU的使用场景MMU是cpu和各种处理器对应的内存管理单元;SMMU/IOMMU是DMA使用的内存管理单元MMU/SMMU的发展是围绕着虚拟......
  • @Transactional 中使用线程锁导致了锁失效
     当线程A将level设置为99时,此时锁已经释放了,但是事务还没提交!!线程B此时可以获取到锁并进行查询,查询出来的level还是线程A修改之前的100,所以出现了并发问题。 解决方案1、@Transactional单独一个方法privateLocklock=newReentrantLock();@Transactionalpublicvoid......
  • 大模型的短期记忆和上期记忆各自的使用场景
    吾名爱妃,性好静亦好动。好编程,常沉浸于代码之世界,思维纵横,力求逻辑之严密,算法之精妙。亦爱篮球,驰骋球场,尽享挥洒汗水之乐。且喜跑步,尤钟马拉松,长途奔袭,考验耐力与毅力,每有所进,心甚喜之。 吾以为,编程似布阵,算法如谋略,需精心筹谋,方可成就佳作。篮球乃团队之艺,协作共进,方显力......
  • Java中的并发数据结构与多线程优化技术
    Java中的并发数据结构与多线程优化技术大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在多线程编程中,并发数据结构和优化技术是提高系统性能和可靠性的关键。Java提供了丰富的并发数据结构和多线程优化技术,本文将详细介绍常用的并发数据结构及其使用方法......
  • 供应链场景使用ClickHouse最佳实践
    关于ClickHouse的基础概念这里就不做太多的赘述了,ClickHouse官网都有很详细说明。结合供应链数字化团队在使用ClickHouse时总结出的一些注意事项,尤其在命名方面要求研发严格遵守约定,对日常运维有很大的帮助,也希望对读者有启发。目前供应链数字化ck集群用来存储实时数据,先通过下面......
  • mongo并发与锁
    MongoDB使用哪种类型的锁定?除了用于读取的共享(S)锁定模式和用于写入操作的独占(X)锁定模式之外,意图共享(IS)和意图独占(IX)模式表示使用更细粒度的锁来读取或写入资源的意图。按一定粒度锁定时,所有更高级别都使用意向锁例如,当锁定一个集合进行写入(使用模式X)时,相应的......
  • 【AI应用探讨】—生成对抗网络(GAN)应用场景
    目录1.图像生成2.数据增强3.图像编辑与风格转换4.视频生成5.游戏设计6.其他领域1.图像生成应用场景:艺术创作:艺术家和设计师使用GAN生成的图像作为创作的灵感,创造出新颖、独特的艺术品。GAN可以生成具有特定风格的画作,如油画、水彩画等,为艺术创作提供新的可能......