简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在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. 11g rac关闭、开启(顺序)

    1.关闭数据库(oracle) srvctl stop database -d rac 2.关闭集群(root) /u01/app/11.2.0/grid/bin/crsctl stop cluste ...

  2. pandas 学习 第14篇:索引和选择数据

    数据框和序列结构中都有轴标签,轴标签的信息存储在Index对象中,轴标签的最重要的作用是: 唯一标识数据,用于定位数据 用于数据对齐 获取和设置数据集的子集. 本文重点关注如何对序列(Series)和 ...

  3. Java基础数据类型详解

    在Java中的数据类型一共有8种,大致分为整型(4个)浮点型(2个)布尔(1)字符(1个) 分类 类型 默认值 占用字节 范围 整型 byte 0 1 = 8 bit -2^7 - 2^7 short ...

  4. Python稳基修炼之异常处理

    错误与异常 1.区分错误与异常 两种错误(都必须改正): 语法错误(代码不规范,格式不对或缺少符号).逻辑错误(逻辑不通) 异常: 程序运行时发生错误的信号 2.异常处理与注意事项 异常处理: 程序员 ...

  5. js中点回车enter触发事件&layui弹窗按enter键不停弹窗问题的解决&js实现鼠标焦点自动落到文本框(layui)

     js中回车触发事件 一. document.onkeydown = function (e) { // 回车提交表单 // 兼容FF和IE和Opera var theEvent = window.e ...

  6. Jquery Javascript 跳转页面传递参数以及获取url的参数

    传递参数: window.location='editCourse.html?dataId='+dataId+''; 获取url中的参数(封装的方法):    function getUrlParam ...

  7. RocketMQ(九):主从同步的实现

    分布式系统的三大理论CAP就不说了,但是作为分布式消息系统的rocketmq, 主从功能是最最基础的了.也许该功能现在已经不是很常用了,但是对于我们理解一些分布式系统的常用工作原理还是有些积极意义的. ...

  8. 十大经典排序算法最强总结(含Java、Python码实现)

    引言 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法.排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面 ...

  9. 远程调用get和post请求 将返回结果转换成实体类

    package org.springblade.desk.utils; import org.apache.http.client.ResponseHandler; import org.apache ...

  10. CODING 静态网站服务升级,快速、稳定、高拓展!

    CODING 静态网站拥有强大的页面托管服务,目前已有数万开发者.设计师.产品经理.团队与企业使用 CODING 静态网站托管了他(她)们的个人网站.博客.企业与产品官网.在线文档等.CODING 静 ...