前言:

业务要求一个简单的并发控制,使得一条数据只被确认一次,我的方案是 悲观锁,就是在事务中先对数据行加锁(MySQL InnoDB 行锁基于索引),判断是否已经确认过,未确认的情况下确认,已确认则事务提交释放锁。代码写完,结果发现未生效,就开始了满脑子问号的排查过程。

业务代码结构如下:

        //不要这么做 //一没对异常进行处理 //二事务的范围太大包含很多不需要在事务中的代码@Transactionalpublic void dangerConfirm(ConfirmDangerRequest request) throws CommonException {String zhiXinBianHao = request.getZhiXinBianHao();//此处方法中包含一次查询操作  查询表 A数据CodeWxid codeWxid = hisDaoService.getCode(request.getConfirmUserId());if (codeWxid == null || codeWxid.getWxId() == null){throw new CommonException("工号或企业微信id有问题", ResultStatusCode.INVALID_CAPTCHA);}//在此行打断点先阻塞//悲观锁  锁表B中的一行数据  mybatisString lock = someMapper.lock("AED5ADC3C67E4A89AB7161DA84DC1FC1");System.out.println(lock);//用JPA查同一条数据 偷懒 表BBaseInfo baseInfo = baseInfoRepository.findByZhiXinBianHao("AED5ADC3C67E4A89AB7161DA84DC1FC1");//用mybatis查询同一行的某个字段  表BString te = someMapper.te("AED5ADC3C67E4A89AB7161DA84DC1FC1");

情况描述:

在MySQL命令行直接开事务,锁同一行,此时上文代码断点往下执行会等待锁的释放,正常。在命令行事务中更新数据中的某个字段,后提交。此时,调试代码获取到锁,向下执行时 发现问题:最后两行,均未查出命令行已经提交的字段的值,即 无法读到其它事务已经提交的数据。这和我所掌握的知识不符。

分析:

数据库MySQL的隔离级别时 RR,不会出现脏读和不可重复读。问题是现在其它事务提交的都读不到,但是数据库软件是可以查到的。没办法了,排除法,把所有与事务无关的注释掉,一执行,好了。。。。。。可以正常查到其它事务已提交的数据。

那么,自然地就定位到 下面这行的问题

//此处方法中包含一次查询操作  查询表 A数据
CodeWxid codeWxid = hisDaoService.getCode(request.getConfirmUserId());

加上上面这行,又不行了。。。。。除了悲观锁那行外,后面又读不到其它事务提交的数据了。。

发现了这个现象,下面就开始做实验(隔离级别为 REPEATABLE-READ):

起两个MySQL命令行客户端A、B,两边都 set autocommit = 0; start transaction;

实验一:A更新一条数据行 id = 1,值更新为 99,此时A不提交,B是查不到新值99的。A提交,B直接查询此条数据,可以查到值99。注意,在此之前B从未执行过查询操作。

实验一:A更新一条数据行 id = 1,值更新为 99,此时A不提交,B是查不到新值99的。A提交,B先任意执行一条查询,再查询此条id=1的数据,就不可以查到值99,查到的是之前的旧值。

这好像很符合 REPEATABLE-READ隔离级别的定义

使用 set @@session.tx_isolation='read-committed'; 将AB会话的隔离级别调整为 read-committed。发现:B事务任何情况下都可以读到A事务刚提交的最新数据。

总结:

MySQL默认的隔离级别为 REPEATABLE-READ,这个隔离级别使得 前后读取同一条的值是相同的,不会受其它事务的影响,除非它自己改变的。

REPEATABLE-READ隔离级别 事务中无法读到其它事务提交了的最新数据相关推荐

  1. mysql innodb事务中_MySQL InnoDB如何保证事务特性示例详解

    前言 如果有人问你"数据库事务有哪些特性"?你可能会很快回答出原子性.一致性.隔离性.持久性即ACID特性.那么你知道InnoDB如何保证这些事务特性的吗?如果知道的话这篇文章就可 ...

  2. 数据库事务隔离级别-- 脏读、幻读、不可重复读(清晰解释)

    一.数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable ,这四 ...

  3. mysql 默认事务隔离级别_一文读懂MySQL的事务隔离级别及MVCC机制

    回顾前文: <一文学会MySQL的explain工具> <一文读懂MySQL的索引结构及查询优化> (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论 ...

  4. mysql四种隔离级别知乎_详解MySQL事务的四大特性和隔离级别

    1.事务的四大特性(ACID) 1.1.原子性(Atomicity) 原子性是指事务包含的一系列操作要么全部成功,要么全部回滚,不存在部分成功或者部分回滚,是一个不可分割的操作整体. 1.2.一致性( ...

  5. 事务隔离级别和传播行为_.spring的事务有几种方式?spring事务的隔离级别和传播行为是什么?...

    展开全部 Spring提供了许多内置事务管理器实现,常用的有: DataSourceTransactionManager(JDBC局部事务):62616964757a686964616fe59b9ee ...

  6. 数据库零碎要点001_数据库的4大特性(原子性_持久性_隔离性_一致性)_数据库的隔离级别(脏读_幻读_不可重复读)_mysql如何设置隔离级别

    本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务 ...

  7. InnoDB在RR隔离级别下解决幻读问题

    表象:快照读(非阻塞读)-伪MVCC 内在:next-key锁(行锁+gap锁) 当前读和快照读 当前读:select-lock in share mode(共享锁),select-for updat ...

  8. MySQL可重复读隔离级别能解决幻读吗?

    事务及事务隔离级别 innodb存储引擎支持事务,myisam不支持事务 事务内的操作要么全部成功,要么全部失败,中途有失败则回滚 事务的ACID:原子性,一致性,隔离性,持久性 事务隔离级别需要解决 ...

  9. mysql trans begin_[原创]MySQL RR隔离级别下begin或start transaction开启事务后的可重复读?...

    Server version:         5.6.21-log MySQL Community Server (GPL) 前提提要: 我们知道MySQL的RR(repeatable read)隔 ...

最新文章

  1. 针对web高并发量的处理
  2. Python进阶:如何将字符串常量转化为变量?
  3. 编写干净的测试–从配置开始
  4. jdbc连接mysql正规方法_JDBC基础篇(MYSQL)——通过JDBC连接数据库的三种方式
  5. powershell自动化操作AD域、Exchange邮箱系列(1)——powershell 简介
  6. 10条建议让你创建更好的jQuery插件(转载)
  7. 端口占用问题解决办法(以1099端口为例)
  8. 思聪吃热狗(双人版)
  9. 阿里云短信SDK使用
  10. 教务信息管理系统的设计与实现
  11. DDD的哲学意味(上)
  12. 利用DCT进行jpg压缩;对图像进行二值化【matlab代码】
  13. 使用树莓派3开发板,基于android things 物联网系统来运行TensorFlow解析图像
  14. 【ACWing】1129. 热浪
  15. python做房源饼状图_python使用matplotlib画饼状图
  16. Python 京东爬虫抢手机小程序
  17. 程伟健:新城易居携手中旅联盟深度发力打造城市中心文旅目的地
  18. JavaScript断言
  19. fpga挂一片ddr2_基于Cyclone III FPGA的DDR2接口设计分析
  20. FTP服务器,部署YUM仓库,NFS共享服务

热门文章

  1. 大数据下的用户画像标签去重
  2. 初三毕业班主任压力过大割喉自尽
  3. 七千年来被国人误解的七句古话
  4. 为什么有的人职场上混得如鱼得水,有的人却混得狼狈不堪呀?
  5. 区块宝周报:区块链一周大事排行榜10.16
  6. session_Composite(组合模式)
  7. Windows10下安装Elasticsearch8.1.1过程遇到的问题
  8. java咖啡是研磨的吗_咖啡的研磨程度,真的很重要吗?
  9. cmd默认是以管理员身份运行
  10. 「会议记录」2019.3.18