博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring @transactional注解和synchronized同步锁同时使用不能同步的问题
阅读量:5894 次
发布时间:2019-06-19

本文共 1398 字,大约阅读时间需要 4 分钟。

  hot3.png

如果在service层的方法上同时使用事务和同步锁无法保证数据同步

@Service  public class Service{       @Transactional(readOnly = false)     public void synchronized update() {           ............       }  }

*上面这个例子无法保证数据的一致性

由于spring的AOP的特性,会在update方法之前开启事务,之后再加锁,当锁住的代码执行完成后,在提交事务。

因此synchronized代码块执行是在事务之内执行的,可以推断在代码块执行完时,事务还未提交,因此其它线程进入synchronized代码块后,读取的数据库数据不是最新的。

为了解决上面的并发同步问题,可以通过synchronized方法调用update()方法,在还没有开事务之前就加同步锁,那么就可以保证线程同步。

1、原实现同步方法

同步方法或者同步方法块都不能达到同步的作用。

@Service  public class Service{        @Transactional(readOnly = false,rollbackFor = SQLException.class)      public synchronized void synMethodOne() throws SQLException{          ............    }       }
@Service  public class Service{        @Transactional(readOnly = false,rollbackFor = SQLException.class)      public void synMethodTwo() throws SQLException{          synchronized(this){              ............           }      }       }

2、修改后的方法 

@Service  public class noTransService {        @Autowired      SynchronizedService synchronizedService;            public synchronized void synMethod() throws SQLException{          synchronizedService.synMethodTwo();      }        }      @Service  public class SynchronizedService{        @Transactional(readOnly = false,rollbackFor = SQLException.class)      public void synMethodTwo() throws SQLException{          ............       }        }

 

转载于:https://my.oschina.net/ljc94/blog/1610125

你可能感兴趣的文章
Linux后门账户控制
查看>>
最大似然估计 (MLE) 最大后验概率(MAP)
查看>>
mvcc摘抄
查看>>
Websocket协议的学习、调研和实现
查看>>
Poj-1274-The Perfect Stall-匈牙利算法
查看>>
『Python』skimage图像处理_旋转图像
查看>>
jquery中beforeSend和complete的使用 --- 提高用户体验&&设置请求头
查看>>
基于RTP的h.264视频传输系统设计(一)
查看>>
【iCore4 双核心板_ARM】例程四:USART实验——通过命令控制LED
查看>>
PostgreSQL存储过程(5)-异常错误处理
查看>>
基于数字证书的UKEY安全登录
查看>>
EF-CodeFirst-3搞事
查看>>
常见的概率分布
查看>>
Python yield 使用浅析
查看>>
【Java】分布式RPC通信框架Apache Thrift 使用总结
查看>>
Angular组件——中间人模式
查看>>
C# 插件热插拔 .NET:何时应该 “包装异常”? log4.net 自定义日志文件名称...
查看>>
设计模式(5)------结构型模式-----装饰者设计模式(IO流的应用)
查看>>
java 读取项目外面配置文件的方法
查看>>
centos7下安装docker
查看>>