spring synchronized锁和事务

古城微笑少年丶 2023-07-16 15:55 90阅读 0赞

最近发现有同事写了一段事务控制的方法中子方法加了锁的代码,而且在事务上用了propagation = Propagation.REQUIRES_NEW,然后稍微研究了下,得出以下结论:

  1. propagation = Propagation.REQUIRES_NEW在执行方法时,不管之前有没有事务,都会创建新的事务,而且这个一般用于嵌套事务的内层事务中,像xxx那样写也有效,不过一般不那样用。
  2. 目前用的是事务(_NEW)在外层,锁在内层的写法,这种写法有风险。并发情况下,A在执行有锁的部分并且有自己的事务,B进来时会创建自己的事务(因为用了_NEW)并且等A执行完有锁的部分。等A执行完有锁的部分,A事务开始执行save,B开始执行有锁的部分,如果A save还没提交,B还是会拿到旧的。 间隔时间很短的情况会取到旧数据,人工很难重现。
  3. 如果继续用这种写法,但不用_NEW,用默认事务,会这样子:在执行有锁的部分并且有自己的事务,B进来时会用A的事务并且等A执行完有锁的部分。等A执行完有锁的部分,A事务开始执行save,B开始执行有锁的部分,如果B save还没提交,A save也不会提交,这样B拿到的肯定是旧的。而且这样很乱,肯定是错的。
  4. 建议写法是锁在外层,事务在内层,这样事务就会被锁管理,事务执行完后锁才会被释放,原理是锁管理事务。

  5. 在service层如果用一个加锁的外层函数调用有事务控制的方法,sonarQube(一个代码风格检查工具)提示可能会有问题,后面在controller那边加了锁,不过之后还是要看下在service层到底有什么问题。

发表评论

表情:
评论列表 (有 0 条评论,90人围观)

还没有评论,来说两句吧...

相关阅读

    相关 spring data-jpa的事务

    JPA是Spring框架下优秀的持久化框架,以仓库作为核心概念玩转各大关系型数据库。 下面要介绍的便是数据库一般都有的事务和锁。 事务 事务是恢复和并发控制的基本单位

    相关 事务

    事务: 事务的关键在于其原子性。原子性的概念是指可以把一些事情当作一个单元来看待。从数据库的角度看,它是指应全部执行或全部都不执行的一条或多条语句的最小组合。当处理数据时,经

    相关 synchronized

    前言:     在程序中,若存在多个线程同时操作共享变量,就会造成线程不安全,要保证多线程操作共享数据安全,必须加上互斥锁,同一时刻只有一个线程可以操作数据。   syn