简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在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. AtCoder Regular Contest 107(VP)

    Contest Link Official Editorial 比赛体验良好,网站全程没有挂.题面简洁好评,题目质量好评.对于我这个蒟蒻来说非常合适的一套题目. A. Simple Math Prob ...

  2. Codeforces Edu Round 55 A-E

    A. Vasya and Book 简单的取余运用. #include <iostream> #include <cstdio> #include <limits.h&g ...

  3. 题解-Koishi Loves Construction

    题解-Koishi Loves Construction 前缀知识 质数 逆元 暴搜 Koishi Loves Construction 给定 \(X\),\(T\) 组测试数据,每次给一个 \(n\ ...

  4. 搭建docker registry私有镜像仓库

    搭建docker registry私有镜像仓库 一.安装docker-distribution yum install -y docker-distribution 安装完成后,启动服务: syste ...

  5. 【Django】django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.0 or newer is required;

    报错信息 django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.0 or newer is required; you have 0 ...

  6. masterha_check_repl --conf=/etc/mha/app1.cnf检查错误

    [mysql@node3 ~]$ masterha_check_repl --conf=/etc/mha/app1.cnf Tue Jul 7 22:43:26 2020 - [warning] Gl ...

  7. 全能扫描王(一款识别率超高的OCR识别APP)

    前言 无论是在工作还是日常生活中,我们都会经常遇到,需要将一些纸质资料上的文字内容变成电子文档进行编辑.这个时候就需要拥有一款好用的手机扫描+OCR文字识别功能的应用了. 随着人工智能的兴起,我们都在 ...

  8. 使用BulkLoad恢复hbase数据

    问题: hbase 集群启动不了,maste一直在初始化,数据面临丢失风险. 解决: 把hbfs上 /hbase 目录移走 改名为/hbase-bak 删除zk上的数据,重新建立一个新的hbase集群 ...

  9. Python高级语法-GIL-理解(4.1.1)

    @ 目录 1.结论 2.代码 关于作者 1.结论 当一个py文件执行多进程的时候,是真的在并发 当一个文件在使用多线程的时候,伪并发,在同一时刻只有一个线程执行,因为GIL Guido都说了,不好除这 ...

  10. PHPSHE 1.7前台SQL注入漏洞分析

    此CMS  SQL注入漏洞产生原因为未将经过 addslashes() 函数过滤的数据使用单引号包裹,从而导致的SQL注入漏洞.接下来看漏洞详情: 首先查看phpshe下的common.php文件37 ...