题记
- 在《事务之概念》提到事务对应现实世界的状态转换,这个过程要满足4个特性
- 这世界,真理只在大炮射程之类,通往和平的道路,非“常人”可以驾驭
- 一个人生活按部就班,人多起来,难免鸡飞狗跳
- 同理现实世界的状态转换映射到数据库,满足4个特性也非一帆风顺
- 在数据库江湖,一个事务任我行,两个事务南北双雄,多事务江湖大乱
- 接下来便是并发事务,幻读的问题
幻读
-
引子
- 组长召开了晨会,更新了开发任务,福报996,那大饼画的真香
- 你情绪激昂,做出积极表态,保证完成任务
- 等等…,这画风完全不符合咱们的审美
- 真实的场景:回到工位上你,先伸个懒腰,侦查完四周,刷起短视频
-
举例子
- 卓别林正在农场中清点猪数,第一此20只,第二遍30只,第三遍15只…
- 某人不禁笑出了猪叫,同事给你使眼色,身后组长的气压蔓延开来
- 就这?说好的通俗易懂,段子多多呢!
- 好吧,江郎才尽…啊!
-
如果一个事务先根据某些条件查询出一些数据,该事务未提交,另一个事务写入、删除了其他符合条件的记录,这就是幻读
- 卓别林数猪,条件是猪,鸡鸭不会计算在内
- 第一遍数了10只
- 隔壁农场正值壮年的猪三哥,看到大圈中搔首弄姿的母猪花花,不服猪命,翻越栅栏,混了进来,第二遍一数11只
- 因此初步理解,便有了转机,前后数的不一样
- 但,这不合理吗?
- 合理呀,学生报名,今天查10个,明天退学了仨,查是7,不一样,合现实世界的理呀!
- 百思不得其解,撇了眼上面的定义,还有个点,会是关键吗?是啥呢!
- 查出一些数据,该事务还未提交
- 你说,咱就数个猪,不是说好的查(select)无事务(铁定不会有锁)
- 问题TM的应该就是这个未提交,但咱不能理解!
- …
- 过了几天,突然一想,这是否应该在一系列场景(业务)下的要求
- 农场展开一场牲畜数量的比赛
- 你数鸡的数量
- 他数牛的数量
- 卓别林数猪的数量
- 在比赛还未结束时(未提交)
- 裁判人员再次进行计算(再数一遍)
- 此时,隔壁农场,放出猪三哥,拐走了母猪花花,咱要公平,就得防着被阴一招
- 所以,裁判人员数的有问题吗,没有问题的
- 只是在当前这个业务下,是有问题的
- 我特么真是个人才…
系列文章
我们来学mysql – 有无事务ID(原理版)
我们来学mysql – 建立索引(原理版)
我们来学mysql – 使用索引(原理版)
我们来学mysql – 索引失效(原理版)
我们来学mysql – 用不上的索引(原理版)
我们来学mysql – 索引上的锁(原理版)
我们来学mysql – 访问方法(原理篇)
我们来学mysql – 连接(原理版)
我们来学mysql – 查询成本之索引选择(原理篇)
我们来学mysql – EXPLAIN之ID(原理篇)