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

隔离性与隔离级别

提到事务,想到的是ACID(原子性,一致性,隔离性,持久性)

  • 原子性:原子性操作就是这个事物执行要么成功,要么失败。将整个过程看作是一个不可分割的整体。

  • 一致性:一致性指的是一个事务在执行前后其状态一致。比如你和小明各有100元,无论你俩之间相互借还多少钱加起来都是200.这就是事务的一致性。

  • 持久性:对于事务来讲,事务一旦提交他对数据库所做的改变是永久的,即使数据库故障也不会产生干扰。

  • 隔离性。

当数据库上有多个事务同时执行的时候,就可能出现脏读、不可重复读、幻读的问题,为了解决这些问题,就有了事务的隔离级别的概念。

  • 脏读:事务 A 读取了事务 B 更新后的数据,但是事务 B 没有提交,然后事务 B 执行回滚操作,那么事务 A 读到的数据就是脏数据
  • 不可重复读::事务 A 进行多次读取操作,事务 B 在事务 A 多次读取的过程中执行更新操作并提交,提交后事务 A 读到的数据不一致。
  • 幻读:事务 A 将数据库中所有学生的成绩由 A -> B,此时事务 B 手动插入了一条成绩为 A 的记录,在事务 A 更改完毕后,发现还有一条记录没有修改,那么这种情况就叫做出现了幻读。

在说隔离级别之前你首先要知道,隔离的越狠,效率就越低。

SQL标准的事务隔离级别包括

  • 读未提交(read uncommitted)
  • 读提交( read commited)
  • 可重复读(repeatable read)
  • 串行化(Serializable)
  1. 读未提交是指,一个事务还没提交时,他做的变更就能被别的事务看到。
  2. 读提交是指:一个事务提交之后,他做的变更才会被其他事物看到。
  3. 可重复读:一个事务执行过程中看到的数据总是跟这个事务启动时看到的数据是一致的,当然在这种隔离级别下,未提交的事务是不可见的。
  4. 串行化:顾名思义就是同一行记录,写的时候加锁,读也会加锁,当出现读写锁冲突时,后访问的事务必须等前一个事务执行完毕,才能继续执行。

隔离级别由小到大:读未提交<读已提交<可重复读<串行化

  • 如果隔离级别是“读未提交” ,则V1的值是2,这时候事务B虽然没有提交但是结果已经被A看到了。因此V2和V3都是2.
  • 若隔离级别是“读提交”则V1是1,V2和V3是2.
  • 若隔离级别是“可重复读”则V1,V2是1,V3是2。因为可重复读要求就是事务在执行期间看到的数据前后必须是一致的。
  • 若隔离级别是“串行化”,则在事务B执行“将1改成2”的时候,会被锁住。直到事务A提交后,事务B才可以继续执行。所以A的角度看,V1,V2是1,V3是2.

在实现上,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。在“可重复读”隔离级别下。这个视图是在事务启动时才创建的,整个事务存在期间都用这个视图。在“读提交”隔离级别下,这个视图是在每个SQL语句开始执行的时候创建的。“读未提交”下直接返回记录上的新值,没有视图概念;而“串行化”隔离级别下直接用加锁的方式来避免并行访问。

事务隔离级别各自能解决的问题是

事务隔离级别 脏读 不可重复读 幻读
读未提交 允许 允许 允许
读已提交 不允许 允许 允许
可重复读 不允许 不允许 允许
串行化 不允许 不允许 不允许

MySQL的默认隔离级别是repeatable-read(可重复读), Oracle数据库的默认隔离级别是“读已提交”,因此对于一些从Oracle迁移搭配MySQL的应用,为保证数据库隔离级别的一致,你一定记得将MySQL的隔离级别设置为“读未提交”。

配置的参数就是将

transaction-isolation的值设置成READ-COMMITED
show variable 来查看当前的值

事务隔离的实现

在MySQL中实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。

例如将num从1改成2,再从2改成3过程中。mysql会保存这几个回滚段,将2改回1,将3改回2. read-viewA,read-viewB.

回滚日志什么时候删除?
再不需要的时候才删除,系统会自动判定当没有事务在需要使用这些回滚日志时,回滚日志会被删除。

在MySQL5.5及以前版本,回滚日志是和数据字典在一起放在ibdata文件里的,即使尝试无最终提交,回滚段被清理,文件也不会变小。长事务除了会堆积大量事务视图占据系统资源,他还占用锁资源,也可能拖垮整个库。

事务的启动方式

  1. 显示启动事务语句,begin / start transaction。配套的提交是commit,回滚是rollback。
  2. set autocommit=0,这个命令会将这个线程的自动提交关闭掉。意味着如果你只执行一个select语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行commit或rollback,或者断开连接。

一般建议使用set autocomiit =1,通过显示语句的方式来启动事务。

commit work and chain,这是提交事务并自动启动下一个事务,这样省去了begin语句的开销。同时带来的好处是从程序开发的角度明确知道每个语句是否处于事务中。

MySQL45讲笔记-事务隔离级别,为什么你改了数据我看不见的更多相关文章

  1. MySQL 笔记整理(3) --事务隔离,为什么你改了我还看不见?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 3) --事务隔离,为什么你改了我还看不见? 简单来说,事务就是要保证一组数据操作,要么全部成功,要么全部失败.在MySQL中,事务 ...

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

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

  3. (转)SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响)

    六.各种事务隔离级别发生的影响 修改数据的用户会影响同时读取或修改相同数据的其他用户.即这些用户可以并发访问数据.如果数据存储系统没有并发控制,则用户可能会看到以下负面影响: · 未提交的依赖关系(脏 ...

  4. SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响)

    六.各种事务隔离级别发生的影响 修改数据的用户会影响同时读取或修改相同数据的其他用户.即这些用户可以并发访问数据.如果数据存储系统没有并发控制,则用户可能会看到以下负面影响: · 未提交的依赖关系(脏 ...

  5. mysql四种事务隔离级别

    mysql事务并发问题 ACID什么的就不啰嗦了.mysql多个事务并发的时候,可能会出现如下问题: 1. 更新丢失 即两个事务同时更新某一条数据,后执行的更新操作会覆盖先执行的更新操作,导致先执行的 ...

  6. 第36讲 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景

    在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...

  7. mysql锁及四种事务隔离级别笔记

    前言 数据库是一个共享资源,为了充分利用数据库资源,发挥数据 库共享资源的特点,应该允许多个用户并行地存取数据库.但这样就会产生多个用户程序并 发存取同一数据的情况,为了避免破坏一致性,所以必须提供并 ...

  8. MySQL实战 | 03 - 谁动了我的数据:浅析MySQL的事务隔离级别

    原文链接:这一次,带你搞清楚MySQL的事务隔离级别! 使用过关系型数据库的,应该都事务的概念有所了解,知道事务有 ACID 四个基本属性:原子性(Atomicity).一致性(Consistency ...

  9. 啥是 MySQL 事务隔离级别?

    之前发过一篇文章,简单了解 MySQL 中相关的锁,里面提到了,如果我们使用的 MySQL 存储引擎为 InnoDB ,并且其事务隔离级别是 RR 可重复读的话,是可以避免幻读的. 但是没想到,都 1 ...

随机推荐

  1. NOIP2020 浙江 游记

    day - ? 由于 CSP-S 的失利,感觉这一次 NOIP 的心态反而是非常的淡定,感觉反正已经炸过一次了,再炸一次好像也没什么,就抱着这样的心态去考试的. day 1 考试当天起晚了,到考场的时 ...

  2. AcWing 361. 观光奶牛

    01规划 设答案为 \(ans\). 二分答案,设当前二分值为 \(mid\). 设一个环 \(S\) 的边权为 \(t_1, t_2, t_3...\),点权为 \(f_1, f_2, f_3... ...

  3. JS怎么把for循环出来的东西放到一个数组里

    var students=[ {name: "vehicleTravelLicenseCopyBack", id: "a1"}, {name: "ve ...

  4. expdp、impdp状态查看及中断方法

    一.expdp状态查看及中断方法 1.查询expdp的job的名字 SQL> select job_name from dba_datapump_jobs; JOB_NAME---------- ...

  5. IDEA创建maven项目很慢的问题解决方式

    问题现象:刚转IDEA开发,发现创建maven项目,非常慢. 解决方式: 构建maven项目添加参数,要不然非常慢,会卡住-DarchetypeCatalog=internal 自动导入包,codin ...

  6. 【Unity】Unity中AR Foundation的使用

    前段时间通过Unity 3d打包测试对比ARCore与ARKit环境探针的效果的过程中,在Google AR Core官网下载到了ARCore for Unity SDK,但是在苹果官网却没有找到AR ...

  7. 5、Mycat安全

    1.权限配置 [1].user标签 目前 Mycat 对于中间件的连接控制并没有做太复杂的控制,目前只做了中间件逻辑库级别的读写权限控制.是通过 server.xml 的 user 标签进行配置. # ...

  8. C#中使用Response下载

    正常流程 正常的从服务器端下载文件的流程 System.IO.FileInfo file = new System.IO.FileInfo(s_path); HttpContext.Current.R ...

  9. Python操作PDF-文本和图片提取(使用PyPDF2和PyMuPDF)

    PDF文件格式 如今,可移植文档格式(PDF)属于最常用的数据格式.在1990年,PDF文档的结构由Adobe定义.PDF格式的思想是,对于通信过程中涉及的双方(创建者,作者或发送者以及接收者)而言, ...

  10. IQueryable的简单封装

    IQueryable的简单封装 前言 前两天在园子上看到一个问题 半年前我也考虑过这些问题,但由于这样那样的问题,没有尝试去解决. 后来公司用上了 abp vnext ,然后有一部分代码可以这样写 p ...