笔记记录自林晓斌(丁奇)老师的《MySQL实战45讲》

3) --事务隔离,为什么你改了我还看不见?

  简单来说,事务就是要保证一组数据操作,要么全部成功,要么全部失败。在MySQL中,事务支持是在引擎层实现的。但并不是所有的引擎都支持事务,这也是MyISAM被InnoDB取代的重要原因之一。

  本篇内容均是在InnoDB下讨论。

  提到事务,总免不了ACID(Atomicity,Consistency,Isolation,Durability),(原子性,一致性,隔离性,持久性),本篇主要讨论的是隔离性。

  隔离性在MySQL中是分为不同的隔离级别的。包括 读未提交(read uncommitted),读提交(read commited),可重复读(repeatable read)(MySQL默认隔离级别),串行化(serializable)。隔离性依次增强。

  • 读未提交: 一个事务还没提交时,它所做的变更就能被别的事务看到。
  • 读提交: 一个事务提交之后,它所做的变更才能被别的事务看到。
  • 可重复读:一个事务的执行过程当中所能看到的数据,总是和这个事务启动时能看到的数据保持一致。当然在可重复读时,这个事务自身所做的变更对其他事务来说也是不可见的。
  • 串行化: 写会加“写锁”,读会加“读锁”,出现读写冲突时,后访问的事务必须等前一个事务执行完成,才能继续执行。

  

  (图片来源于 极客时间 林晓斌 《MySQL 实战45讲》,如有版权问题请联系我删除)

  以上图为例,在四种隔离级别下对应的情况分别为:

  • 读未提交:事务A启动时查询结果为1, V1时值为2(读到了事务B未提交的数据),V2时值为2,V3时值为2
  • 读提交:事务A启动时查询结果为1, V1时值为1(读不到事务B未提交的数据),V2时值为2(事务B已经提交,可以被事务A读到),V3时值为2
  • 可重复读:事务A启动时查询结果为1, V1时值为1(读不到事务B未提交的数据),V2时值为1(事务A未提交,在事务A过程内保持与事务A启动时读到的数据一致),V3时值为2(事务A已经提交)
  • 串行化:事务B在执行将1改成2时会被锁住,直到事务A提交后,事务B才可以继续执行。因此 V1,V2的值是1,V3的值是2.

  在实现上,数据库里会创建一个视图,访问的时候以视图的逻辑结果为准。 在“可重复读”下,这个视图是在事务启动时建立的。在“读提交”下,这个视图是在每个SQL语句开始执行的时候创建的。另:“读未提交”下,不创建视图,直接返回记录上的最新值。在“串行化”下使用加锁的方式来避免进行并行访问。

事务隔离级别的实现:

  以可重复读为例,假设将一个值从1案顺序改成2,3,4.在回滚日志里会有如下的记录。

  

  (图片来源于 极客时间 林晓斌 《MySQL 实战45讲》,如有版权问题请联系我删除)

  在MySQL中,实际上每条记录在更新的时候都会同时记录一条回滚操作,通过这个回滚操作可以获得更新前的记录。当前值是4,但是在查询这条记录时,不同时刻启动的事务会有不同的read-view. 同一条记录在系统中存在多个版本,这就是数据库的多版本并发控制(MVCC),对于A来说,要想得到1,就必须将当前所有操作依次回滚。即使这个时候有一个新的事务将4改成其他值,这个新的事务也和之前是事务没有冲突。每个事务被隔离开来了。

  当然,回滚操作的日志不会一直保留,直到系统中没有比这个回滚操作更早的read-view时就会删除回滚操作日志。因此当你使用长事务时,系统中可能会存在很古老的read-view视图,当然对应的回滚操作也不会删除,回滚日志就会变得很大。

上篇问题答案:

  请问在什么场景下,一天一次备份会比一周一次备份更有优势?或者说,它影响了这个数据系统的哪些指标?

  在一天一备份的情况下,最坏情况需要应用一天的binlog,一周一备份则会需要使用一周的binlog了。系统的对应指标就是 RTO(恢复目标时间)。当然也不是说一天一备份就完全优于一周一备份,因为频繁的全量备份需要消耗更多存储空间,需要根据具体业务来评估。

问题:

  如果你是数据库负责人,你有什么方案来避免长事务呢?

MySQL 笔记整理(3) --事务隔离,为什么你改了我还看不见?的更多相关文章

  1. mysql实战45讲 (三) 事务隔离:为什么你改了我还看不见 极客时间读书笔记

    提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务.最经典的例子就是转账,你要给朋友小王转100块钱,而此时你的银行卡只有100块钱. 转账过程具体到程序里会有一系列的操作,比如查询余额 ...

  2. MySQL 笔记整理(8.b) --事务到底是隔离还是不隔离的?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 8.a) --事务到底是隔离还是不隔离的? 本周工作较忙,加上懒惰,拖更 ...

  3. 最全mysql笔记整理

    mysql笔记整理 作者:python技术人 博客:https://www.cnblogs.com/lpdeboke Windows服务 -- 启动MySQL net start mysql -- 创 ...

  4. 【原创】互联网项目中mysql应该选什么事务隔离级别

    摘要 企业千万家,靠谱没几家. 社招选错家,亲人两行泪. 祝大家金三银四跳槽顺利! 引言 开始我们的内容,相信大家一定遇到过下面的一个面试场景 面试官:"讲讲mysql有几个事务隔离级别?& ...

  5. MySQL数据库引擎、事务隔离级别、锁

    MySQL数据库引擎.事务隔离级别.锁 数据库引擎InnoDB和MyISAM有什么区别 大体区别为: MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能 ...

  6. 互联网项目中mysql应该选什么事务隔离级别

    引言 开始我们的内容,相信大家一定遇到过下面的一个面试场景 面试官:“讲讲mysql有几个事务隔离级别?” 你:“读未提交,读已提交,可重复读,串行化四个!默认是可重复读” 面试官:“为什么mysql ...

  7. 【转】互联网项目中mysql应该选什么事务隔离级别

    作者:孤独烟 转自:https://www.cnblogs.com/rjzheng/p/10510174.html 摘要 企业千万家,靠谱没几家.社招选错家,亲人两行泪. 祝大家金三银四跳槽顺利! 引 ...

  8. MySQL 笔记整理(7) --行锁功能:怎么减少行锁对性能的影响?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 7) --行锁功能:怎么减少行锁对性能的影响? MySQL的行锁是在引擎层由各个引擎自己实现的.因此,并不是所有的引擎都支持行锁,如 ...

  9. MySQL的四种事务隔离级别

    本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...

随机推荐

  1. Web开发者の实用代码账簿

    介里就都是恶魔菌整理的我平时会用的代码啦-现在在这里总结规划一下,希望能对你以及其他阅读这篇文章的小可耐们有帮助喵!欢迎订阅我的博客来get恶魔菌记事簿的新动态鸭! ↓ ↓ ↓ 以下就是内容啦~记得看 ...

  2. .net 发布程序时出现“类型ASP.global_asax同时存在于...”错误的解决办法

    web程序发布后,通过浏览器访问程序显示如下的错误信息: 编译器错误消息: CS0433: 类型“ASP.global_asax”同时存在于“c:\WINDOWS\Microsoft.NET\Fram ...

  3. 从url中获得域名

    import java.net.MalformedURLException; import java.net.URL; /** * * @author csh * */ public class AA ...

  4. C# CreateParams的使用(解决闪屏问题)

    <转载自:https://blog.csdn.net/xpwang/article/details/53427479> 窗体和控件的属性CreateParams(这真的是一个属性)很神奇, ...

  5. swust oj 1012

    哈希表(链地址法处理冲突) 1000(ms) 10000(kb) 2542 / 6517 采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用链地址法.建立链表的时候采用尾插法 ...

  6. 【转】线段树完全版~by NotOnlySuccess

    线段树完全版  ~by NotOnlySuccess 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉 ...

  7. 请输入一个大于7的整数,输出小于k并且至少满足下面2个条件中的1个条件的所有正整数

    import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/6 22:06 * @description ...

  8. 将字符串XX,SS以“,”符号进行区分并分别存储在数组中

    public static void main(String[] args) { String str = "EAN_13,1534651"; String strs[] = st ...

  9. 课堂笔记及知识点----UI框架简介(2018/10/25)

    UI框架学习目标: 要知道怎样套用的! 框架里面的基本执行流程 怎样开始执行(配置文件) 怎么套用 最主要的三个脚本: (也是多态的体现之一) 1).BaseUI: 作用-->提供UI能够使用的 ...

  10. Javascript高级编程学习笔记(88)—— Canvas(5)绘制文本

    绘制文本 同样的,canvas也为绘制文本提供了相应的方法. 2D上下文提供的文本绘制方法主要有两个: fillText() strokeText() 这两个方法都接受四个参数 要绘制的文本字符串 绘 ...