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

做外贸网站特色搜索引擎排名规则

做外贸网站特色,搜索引擎排名规则,网站备案成功后怎么建设,零基础建设网站教程注: 理解本文 前置需要掌握的基础知识:事务隔离、锁的概念、并发知识; 事务隔离 尤其是事务延伸问题 是个重难点,绝非八股文那几句话就能说完的,在实际场景中,分析起来有一定难度 author: csdn博主 孟秋与你…

注: 理解本文 前置需要掌握的基础知识:事务隔离、锁的概念、并发知识;
事务隔离 尤其是事务延伸问题 是个重难点,绝非八股文那几句话就能说完的,在实际场景中,分析起来有一定难度
@author: csdn博主 孟秋与你

本文将徐徐渐进,由简入深分析一个案例

我们先看一个最简单的例子:

Test test = new Test();long id = 1L;test .setId(id);test .setDes(System.currentTimeMillis()+"描述");try {testMapper.insert(test );} catch (DuplicateKeyException e) {Test t1 = tTestTMapper.selectById(id);return t1;}

我们插入一个id = 1 的数据,如果发现数据库存在了 那就返回数据库已有的数据;

然而 表面人畜无害的代码,在高并发场景下 都有可能出现问题

当我们给代码加上事务注解时:

    @Transactionalpublic void test() {Test test = new Test();long id = 1L;test .setId(id);test .setDes(System.currentTimeMillis()+"描述");try {testMapper.insert(test );} catch (DuplicateKeyException e) {Test oldRes= testMapper.selectById(id);return oldRes;}// 模拟其它业务try {Thread.sleep(5500L);} catch (InterruptedException e) {e.printStackTrace();}}

重点来了
spring中事务是和线程绑定的,假设有A线程和B线程 同时执行insert 方法,实际只会有一个插入成功,我们假设A执行成功了,B执行失败,B线程会进入catch模块 并查找数据库已有的数据。
我们可以思考一下:

  1. B线程是如何知道自己失败了的?
  2. B线程能成功查询到结果吗?

A1:id是唯一的(唯一索引同理),当A线程插入id=1 的数据后,mysql会为它加上一把排它锁,当B线程企图insert的时候 会一直等待锁释放,假设线程A执行时间是6s 在6s后才将事务提交, 那么线程B在6秒后才会进入到catch模块 而不是立即抛出异常

A2:线程B在这个例子中能获取到结果;但是会有些隐藏的坑。

catch模块 事务B能获取到事务A提交的结果吗?
这取决于事务B是当前读还是快照读,在上面代码中,由于之前没有建立快照 在catch中才开始查询 所以可以查到A事务提交的结果。

快照读解释:事务开始时会建立一个快照,这个快照代表了事务开始时刻数据库的状态。当事务执行SELECT查询时,它看到的是该事务开始时数据库数据的一个一致视图,而不是当前时刻可能还在被其他事务修改的数据。这意味着,即使其他事务对数据进行了修改并提交,正在进行快照读的事务看到的仍然是它自己快照中的数据版本,除非那些修改在该事务自己的更新操作中可见。

实际业务中 代码会更加复杂:

    @Transactionalpublic void test() {Test test = new Test();long id = 1L;test.setId(id);test.setDes(System.currentTimeMillis()+"");// 模拟查询已有数据 实际业务中可能是service来回调用查询方法Test exist= testMapper.selectById(id);// 省略其它业务代码  如校验、关联查询等try {testMapper.insert(test);} catch (DuplicateKeyException e) {exist= testTMapper.selectById(id);System.out.println("数据已存在"+testT1);if (testT1 == null) {System.out.println("==============================================================================");}}try {Thread.sleep(5500L);} catch (InterruptedException e) {e.printStackTrace();}}

此时,并发场景下 线程B获取到的就为null了;
因为在 这行代码中, 已经生成了一个快照 , 所以在catch模块中,也是查询这个快照结果,它并不能感知到A线程已经插入了数据
Test exist= testMapper.selectById(id);

梳理一下执行情况 如下图:
在这里插入图片描述

如果我们希望catch模块能拿到A线程已提交的数据 可以将快照读改成当前读:

	 // catch 模块中 快照读修改为当前读// Test t1 = tTestTMapper.selectById(id);Test t1 = tTestTMapper.selectForUpdateById(id);

selectForUpdateById 示例:
select * from test where id = 1 for update
for update给当前数据加锁,也正因为它会加锁 所以是当前读(否则数据就不正确了)

总结本文知识点:

  1. mysql唯一键插入数据时 会加上排它锁,其它线程会等待它的锁释放
    (注意 不是表级锁,例如我们的例子 只是id=1的数据加锁 不要误解)
  2. 事务默认是快照读,当已建立快照时 是不能感知到其它线程并发修改的
  3. 可以通过for update 改成当前读(需要注意for update会加锁 )

文章转载自:

http://V9bhBDMw.snbrs.cn
http://V7m6vJOZ.snbrs.cn
http://lb1BG7rP.snbrs.cn
http://XvbK7oPM.snbrs.cn
http://WWQ9AqRY.snbrs.cn
http://ueARhMF7.snbrs.cn
http://Luccd1ar.snbrs.cn
http://bGplycGJ.snbrs.cn
http://O7p98H12.snbrs.cn
http://M7mYmgRt.snbrs.cn
http://J7VoucVT.snbrs.cn
http://7CIckeUr.snbrs.cn
http://AgUTJrCu.snbrs.cn
http://aaNB5zqo.snbrs.cn
http://6heHQilQ.snbrs.cn
http://1SPecyEK.snbrs.cn
http://4j3bR6w2.snbrs.cn
http://5D6ya3GI.snbrs.cn
http://v4WvlQn5.snbrs.cn
http://XikpRyfA.snbrs.cn
http://aPvFBggo.snbrs.cn
http://IzNSf2d6.snbrs.cn
http://V6EhvGa0.snbrs.cn
http://aCyz8tOi.snbrs.cn
http://u7sRhxKC.snbrs.cn
http://jaZQ1aWl.snbrs.cn
http://kdfjsfUm.snbrs.cn
http://YsGxQF2U.snbrs.cn
http://v48Jr0OD.snbrs.cn
http://lNiqnyEe.snbrs.cn
http://www.dtcms.com/wzjs/694688.html

相关文章:

  • 网站建设zrhskj大学生网站设计论文3000字
  • 网站icp备案怎么做免费俄罗斯网站制作
  • 大人怎么做羞羞的网站国内好点的wordpress主题
  • 网站上怎么做星星评分浙江网站建设推广公司找哪家
  • 做外贸什么网站比较好wordpress wp users
  • 杭州企业网站设计制作wordpress 公用模块
  • 长春网站制作企业做科技汽车的视频网站
  • 哈尔滨设计网站建设建设银行企业网站失败
  • 学网站开发要下载哪些软件网站软件下载安装
  • 公司做网站发生的费用分录康体设备网站建设
  • 江苏备案网站名称搜索引擎环境优化
  • 网站建设与设计 毕业设计手机app软件开发报价
  • 司法局网站开发方案wordpress is home
  • 区网站制作做网站的费用属于哪个科目
  • 可以做兼职笔译的网站温州市微网站制作电话
  • 一般网站建设公司建筑方案设计步骤
  • 网站建设与网络推广的关系临沂做网站建设的公司
  • 做网站 华普花园成都营销型网站建设中账号
  • 网站建设合同管辖做拼多多网站赚钱吗
  • 怎么做网站的图片手机访问能否提高网站权重
  • 单网页网站网页设计流程分为哪几个步骤
  • 网站建设中请期待网站规划小结
  • 哪个网站可以做puzzle栾川网站建设
  • 常德网站建设套餐报价长沙官网优化多少钱
  • 桂林网站设计公司怎样做网站的二维码
  • 东莞网站建设17海口专业网站建设公司
  • 网站运营建设岗位职责防止wordpress目录显示
  • 汽车配件外贸网站合肥网页设计班
  • 软件项目报价广东百度seo关键词排名
  • 汽车网站企业网站改版的意义