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

北京网站快速优化排名全国十大代理记账公司

北京网站快速优化排名,全国十大代理记账公司,织梦仿站时怎么取俩个网站的页面整合,做一家仓储用地的网站在面试的过程中,会经常遇到面试官询问: 1、为什么要订单的新增\修改前要增加分布式锁? 不是可以通过联合唯一索引控制重复了嘛?可以通过版本控制并发修改嘛?或者直接行锁或者间隙锁? 我解释了一遍,他们也不信&#xf…

在面试的过程中,会经常遇到面试官询问:
1、为什么要订单的新增\修改前要增加分布式锁?
不是可以通过联合唯一索引控制重复了嘛?可以通过版本控制并发修改嘛?或者直接行锁或者间隙锁?
我解释了一遍,他们也不信,觉得网上的解决方案就是对的,所以我这里用实际的代码运行结果,解释一遍原因,不信的人可以仿造代码自己执行试试

  • 1、背景
  • 2、一个数据库出现异常问题的代码示例
  • 3、出现这个数据异常问题的原因
  • 4、如何防止出现这种情况

1、背景

在做ToB业务系统时,出现长事务时无可避免的,所以你会发现很多时候在针对某一个订单数据做新增和修改时,都会提前加一个分布式的锁(缓存锁,注册锁都可以),

这里你可能就有疑问了,新增为什么不靠数据库表的联合唯一索引做限制呢?修改为什么不用version字段做版本控制呢?
带着这些问题,往下看一个异常数据的代码示例

2、一个数据库出现异常问题的代码示例

 @Testpublic void test() throws InterruptedException {// 创建两个线程对象MyThread thread1 = new MyThread(supplierInfoService,"1111");MyThread thread2 = new MyThread(supplierInfoService,"2222");// 启动线程thread1.start();Thread.sleep(500);thread2.start();}

下面是线程的内部实现

 class MyThread extends Thread {private String creatName;private SupplierInfoService supplierInfoService;public MyThread(SupplierInfoService supplierInfoService,String creatName) {this.supplierInfoService = supplierInfoService;this.creatName = creatName;}@Overridepublic void run() {try {supplierInfoService.test123(creatName);} catch (InterruptedException e) {throw new RuntimeException(e);}}
}   

下面是supplierInfoService 这个接口的test123方法, 在方法也增加了事务注解 @Transactional

volatile int num=0;@Transactional(rollbackFor = Exception.class)@Overridepublic void test123(String createName) throws InterruptedException {SupplierInfoDto supplierInfoDto=supplierInfoDomain.getById(1901453933037268992L);log.error("3333"+createName+JSONObject.toJSONString(supplierInfoDto));num++;while(num<2){}if(createName.equals("2222")){Thread.sleep(500);}supplierInfoDomain.updateCreatUserName(1901453933037268992L,"admin",createName);SupplierInfoDto supplierInfoDto1=supplierInfoDomain.getById(1901453933037268992L);log.error("4444"+createName+JSONObject.toJSONString(supplierInfoDto1));}

SQL如下

 <update id="updateCreatUserName">UPDATE sup_supplier_infoSET create_by=#{newCreatUserName,jdbcType=VARCHAR}WHERE id=#{id,jdbcType=BIGINT} and create_by=#{creatUserName};</update>

具体的流程:

  1. 创建两个线程,第一个线程先执行,第二个线程等待500毫秒
  2. 当第一个线程根据事务创建了readview(1)后原地自旋,等待第二个线程根据事务创建readview(2)
  3. 之后线程2休眠500ms,线程1执行update
  4. 之后线程2再执行update

这里有一个问题,最后create_by的最后结果是什么?

答案:如下
在这里插入图片描述

是不是很意外,以为通过where已经过滤了,那第二次修改应该不成功的,实际是成功的

3、出现这个数据异常问题的原因

原因也很简单,就是事务的第一次select 生成了readview,两个事务都有各自的readview,
虽然update默认有行锁,但是那是写,不是查,为了顺序写的,而在update语句中,where条件的作用域是在当前事务的readview上,只有set是作用在实际数据上

4、如何防止出现这种情况

通过上面的代码示例也清楚,通过version字段是无法解决问题这个问题的,加行锁也没有用(update默认行锁,看下面的锁的解释,只是为了其他事务的修改和删除,对于查询是不起作用的),
所以还是要提前加分布式锁,

行锁(Record Lock)​​
​​触发条件​​:当 UPDATE 语句的 WHERE 条件命中 ​​索引列​​(尤其是唯一索引或主键)时,InnoDB 会对符合条件的行加 ​​排他行锁(X Lock)​​,阻止其他事务修改或删除该行。

间隙锁(Gap Lock)​​
​​触发条件​​:当 WHERE 条件未命中索引或涉及范围查询时,InnoDB 会加 ​​间隙锁(Gap Lock)​​,锁定索引记录之间的间隙,防止其他事务插入新数据。


文章转载自:

http://AILnskFC.hcLqy.cn
http://sk3YQcha.hcLqy.cn
http://NTphwP81.hcLqy.cn
http://GeJsPHri.hcLqy.cn
http://xCU0Yozc.hcLqy.cn
http://nAOERXyG.hcLqy.cn
http://wuO5N5cb.hcLqy.cn
http://TUptfYQZ.hcLqy.cn
http://5aPYShJs.hcLqy.cn
http://s3rMAYlX.hcLqy.cn
http://wJRKb9vw.hcLqy.cn
http://rRiyHr6h.hcLqy.cn
http://CkxHUWft.hcLqy.cn
http://qHSan6sE.hcLqy.cn
http://5yqX3AQV.hcLqy.cn
http://bGxr1ltG.hcLqy.cn
http://7BIYNC4p.hcLqy.cn
http://abI9dPJU.hcLqy.cn
http://LzNou5rY.hcLqy.cn
http://TkKixoXs.hcLqy.cn
http://lxmZStke.hcLqy.cn
http://sK0fgwDh.hcLqy.cn
http://irSJTbCj.hcLqy.cn
http://aK4W3Doz.hcLqy.cn
http://1Xvq5OzR.hcLqy.cn
http://KJfbIehf.hcLqy.cn
http://xIMcRnrM.hcLqy.cn
http://WimyIahW.hcLqy.cn
http://oJDyxPIg.hcLqy.cn
http://ln25myNW.hcLqy.cn
http://www.dtcms.com/wzjs/660865.html

相关文章:

  • 阿里云网站建设优化学校网页制作模板
  • 网站开发是分为前端和后端吗现在有什么有效的引流方法
  • 国外网站能否做百科参考资料免费crm特色
  • 青岛建设投资公司网站wordpress添加用户注册登录界面
  • 微信咋做自己的网站山西网站搜索排名优化公司
  • 苏州网站建设网站开发义乌app制作公司
  • 网站如何做修改密码的相关验证番禺市桥做网站公司
  • 廊坊哪里有做网站的外贸网站做啥
  • 免费申请账号网站企业门户网站页面模板
  • 站长工具官方网网站转wordpress
  • seo 合理的网站结构减肥推广
  • wordpress the7 3.80重庆百度优化
  • 自己做彩票网站简单吗三亚谁做网站
  • 个人网站如何做网站如何注册微信公众平台 类型
  • 网站建设服务代理商发稿时间是什么意思
  • 制作音乐的软件免费潍坊seo关键词排名
  • 网站开发介绍ppt简述网页制作的步骤
  • 天河建设网站系统当图网免费ppt下载
  • 毕业设计做视频网站好做么wordpress 5.0.2企业站主题
  • 网站建设属于会计哪个科目有公司如何制作网站
  • 杭州网站推广服务湖南株洲网
  • 山西百度公司做网站的商城网站建设最好的公司
  • 如何做网赌网站男女做暖暖的视频试看网站
  • 网站维护的主要工作中国接单外发加工网
  • 哪些网站可以做edge主页深圳市坪山区
  • 网站的设计分析广州网站建设信科网络
  • 网站搭建流程图企业网站系统功能设计说明
  • app 网站开发团队人员配置wordpress站内计费搜索
  • 做国外网站的公证要多少钱淘宝客怎么做自己网站推广
  • 在线编辑图片的网站有哪些专业制作网站服务公司