丁奇的MySQL基础课
林晓斌(网名“丁奇”)
前阿里资深技术专家
立即订阅
4 人已学习
课程目录
已完结 6 讲
01 | 基础架构:一条SQL查询语句是如何执行的?
免费
02 | 日志系统:一条SQL更新语句是如何执行的?
03 | 事务隔离:为什么你改了我还看不见?
04 | 深入浅出索引(上)
05 | 深入浅出索引(下)
06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
丁奇的MySQL基础课
登录|注册

03 | 事务隔离:为什么你改了我还看不见?

林晓斌 2019-08-09
提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱。
转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的,不然等程序查完之后,还没做减法之前,你这 100 块钱,完全可以借着这个时间差再查一次,然后再给另外一个朋友转账,如果银行这么整,不就乱了么?这时就要用到“事务”这个概念了。
简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 MySQL 中,事务支持是在引擎层实现的。你现在知道,MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务。比如 MySQL 原生的 MyISAM 引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一。
今天的文章里,我将会以 InnoDB 为例,剖析 MySQL 在事务支持方面的特定实现,并基于原理给出相应的实践建议,希望这些案例能加深你对 MySQL 事务原理的理解。

隔离性与隔离级别

提到事务,你肯定会想到 ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),今天我们就来说说其中 I,也就是“隔离性”。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《丁奇的MySQL基础课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(10)

  • 墨飞域
    我觉得对于一个长事务,主要就是保证一系列更新操作的原子性,如果出现过长的事物,一定就是业务设计或者架构设计的不合理,通过调整上层的业务抽象,对应于到长事务上,也许就能把长事务改成略短一些的事物。
    2019-08-17
    2
    2
  • Geek_steven_wang
    autocommit开启,其对mysql的性能有一定影响吧,举个例子来说,如果你插入了1000条数据,mysql会commit1000次的,如果我们把autocommit关闭掉,通过程序来控制,只要一次commit就可以了。请问这个怎么考虑?为了存储空间放弃效率?
    2019-11-23
  • Sic Pavis
    之前业务上甚至会避免事务,因为不涉及交易系统。所有的中间态都是可以接受的,业务处理也是幂等的。虽说有些成本,好在都是研发熟悉的业务处理,不需要深入研究各种事务机制
    2019-09-23
  • _yh葱
    从框架层面把长事务切成多个小业务,那等用完了,系统自动识别删除回收,哈哈
    2019-09-20
  • _yh葱
    尽量把业务切成多个小的功能,然后他们自己在里面写事务。
    2019-09-20
  • Geek_b8bf97
    可以把长事务分一下类:
    读长事务考虑读的性能,比如增加缓存,添加索引等提高性能;如果用了连接池,注意连接池里设定的连接时间,还有监控的时候如果发现查询长事务影响数据库,及时kill掉哈哈哈
    写事务的话:如果可以的话尽量做业务切割吧
    2019-08-18
    1
  • JasonLong
    串行化,在读数据的时候,加表级共享锁。最高的隔离级别
    2019-08-17
  • JasonLong
    避免长事务: 隔离级别用可重复读,开启自动提交。
    2019-08-17
  • 谷鱼
    将业务逻辑变成原子性,后续的便可以依据进行更新来记录数据
    2019-08-15
  • 西恩
    我对文章中描述回滚日志的那个图片有点疑惑,事务1将值改成2后没提交,此时事务2应该不能改相同的值吧(同行同列的值),并且事务2读到的值应该是事务1改之前的值,因此我的理解是mvcc描述的是同一个值在不同事务中可以有不同的值,但修改是互斥的,不知道我的理解是否有问题?
    2019-08-13
    1
收起评论
10
返回
顶部