当前位置: 首页 > news >正文

设计logo网站免网站软件免费下载

设计logo网站免,网站软件免费下载,福田网站的建设,打开这个网站你会回来感谢我的记一次并发问题 Synchronized 失效 场景:为避免信息提交重复,给事务方法增加了synchronized修饰符,实际场景中仍然无法完全避免重复,原因是因为在第一个线程执行完synchronized代码段后,此时spring还未完成事务提交&a…

记一次并发问题 Synchronized 失效

场景:为避免信息提交重复,给事务方法增加了synchronized修饰符,实际场景中仍然无法完全避免重复,原因是因为在第一个线程执行完synchronized代码段后,此时spring还未完成事务提交,但是其他线程已经进入该代码段,导致信息提交重复。

在这里插入图片描述

这里是部分spring aop 实现声明式事务的代码:

PlatformTransactionManager ptm = asPlatformTransactionManager(tm);final String joinpointIdentification = methodIdentification(method, targetClass, txAttr);if (txAttr == null || !(ptm instanceof CallbackPreferringPlatformTransactionManager)) {// Standard transaction demarcation with getTransaction and commit/rollback calls.TransactionInfo txInfo = createTransactionIfNecessary(ptm, txAttr, joinpointIdentification);Object retVal;try {// This is an around advice: Invoke the next interceptor in the chain.// This will normally result in a target object being invoked.retVal = invocation.proceedWithInvocation();// 这里执行完成我们被代理的方法以后资源就已经被释放掉了,// 导致后面的线程可以获得这个锁资源,可以执行方法中的临界区代码}catch (Throwable ex) {// target invocation exceptioncompleteTransactionAfterThrowing(txInfo, ex);throw ex;}finally {cleanupTransactionInfo(txInfo);}if (retVal != null && vavrPresent && VavrDelegate.isVavrTry(retVal)) {// Set rollback-only in case of Vavr failure matching our rollback rules...TransactionStatus status = txInfo.getTransactionStatus();if (status != null && txAttr != null) {retVal = VavrDelegate.evaluateTryFailure(retVal, txAttr, status);}}// 提交事务,也就是说这里的事务还没有提交,但是后面过来的线程已经在查询数据库了,// 所以查询到的数据还是falsecommitTransactionAfterReturning(txInfo);return retVal;}

在多线程环境下,就可能会出现:方法执行完了(synchronized代码块执行完了),事务还没提交,别的线程可以进入被synchronized修饰的方法,再读取的时候,读到的是还没提交事务的数据,这个数据不是最新的,所以就出现了这个问题。

方案1 很简单 那就是不开事务就行了,再这个方法上不加事务就行 因为 Synchronized 可以保证线程安全。
这个方案的意思就是说不要再同一个方法上用@Transaction 和 Synchronized 例子图就没有贴了 就像我前面的 把注解去掉就好了 (但是前提你这个方案确定是不需要事务)

方案2 再这个里面再调用一层service 让那个方法提交事务,这样的话加上Synchronized 也能保证线程安全。或者直接在controller层加上锁,就可以保证整个方法的原子性了;

Synchronized 失效关键原因:是因为Synchronized锁定的是当前调用方法对象,而Spring AOP 处理事务会进行生成一个代理对象,并在代理对象执行方法前的事务开启,方法执行完的事务提交,所以说,事务的开启和提交并不是在 Synchronized 锁定的范围内。出现同步锁失效的原因是:当A(线程) 执行完insertSelective()方法,会进行释放同步锁,去做提交事务,但在A(线程)还没有提交完事务之前,B(线程)进行执行findOrder() 方法,执行完毕之后和A(线程)一起提交事务, 这时候就会出现线程。

http://www.tj-hxxt.cn/news/5291.html

相关文章:

  • 专业做网站的技术人员郑州靠谱seo整站优化
  • 下载百度官方网站超级优化大师
  • 旅游网站开发目标做百度推广需要什么条件
  • 网站建设尺寸大小合肥网站推广公司哪家好
  • 两个网站链接如何做怎么做网站教程视频
  • 一个女装店网站建设的策划模板百度网盘登陆入口
  • 制作一个公司网站的流程宁波seo快速优化公司
  • 做360网站优化快速排今日新闻简报
  • 绵阳公司商务网站制作常见的网络营销策略都有哪些
  • 花店网站推广方案下载百度地图2022最新版官方
  • 如何提高网站响应速度有站点网络营销平台
  • 06627网页制作与网站建设友情链接交换软件
  • 东莞建设网站公司简介海外营销
  • 网页翻译的快捷键是什么seo服务靠谱吗
  • wordpress 禁止评论上海搜索优化推广哪家强
  • 中国三农建设工作委员会官方网站精准营销案例
  • 网站编程赚钱在线crm网站
  • 怎么做网络彩票网站服务营销案例100例
  • 网站建设 推广seow
  • 自己做网站要不要钱东莞百度推广优化排名
  • 戈韦思苏州网站建设企业网站建设方案论文
  • 展厅设计多少钱一平米苏州手机关键词优化
  • dz网站设置了关键词但是不显示赚钱软件
  • 大连网站建设微信群seo网站优化工具
  • 网站域名被重定向怎么找到精准客户资源
  • 国外专卖模板的网站seo三人行论坛
  • 南京企业自助建站市场调研报告怎么写范文
  • 青岛胶南做网站的有多少网站推广优化排名教程
  • 如何建立一个购物网站网络运营和网络营销的区别
  • 为什么打不开中国建设银行网站人民日报最新消息