事务将数据库从一个一致状态转换至另外一个一致状态,若某个事务看到了另外一个事务在状态转换过程中的中间态数据(不一致状态),将有可能导致另外一个事务的操作基于一个不一致的数据库状态,进而数据库失去一致性。事务隔离性主要用于处理数据库的并发访问问题。

ACID

回顾事务的ACID特性,ACID分别是一下四个词的缩写:

  • Atomicity(原子性)
  • Consistency(一致性)
  • Isolation(隔离性)
  • Durability(持久性)

事务隔离性

“隔离性还有其他的称呼,如并发控制(concurrency control)、可串行化(serializability)、锁(locking)等。事务的隔离性要求每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见,通常这使用锁来实现。当前数据库系统中都提供了一种粒度锁(granular lock)的策略,允许事务仅锁住一个实体对象的子集,以此来提高事务之间的并发度。”

简单的说,事务隔离性就是指在并发情况下,事务能够相互隔离,不彼此影响,避免一些“不良反应”。

事务并发

在并发状态时,如果不控制好事务,如果事务没有隔离性,会有哪些“不良反应”?

    • 脏读(Dirty read):

      1. 事务 A 在操作数据时,把数据 a 改成 b,但是事务未提交;
      2. 此时数据 a 是之前的数据,是有效的。数据 b 未提交,是无效的,如果在事务处理期间发生错误,数据 b 会回滚到 a;
      3. 如果此时事务 B 访问了数据,得到的是 b,那么就发生了脏读,读到了“脏数据” b。
    • 不可重复读(Unrepeatableread):

      1. 因为业务需要,事务 A 在处理事务过程中,需要多次读取数据 a=1,而且每次读取的结果需要一样,即 a 时刻保持1;
      2. 事务 B 在事务 A 的处理过程中,修改了 a 的值,a=2;

      事务 A 对于数据 a,不能保证重复读取时的值保持一致,这就是不可重复读。

    • 幻读(Phantom):

      1. 事务 A 读取满足条件的某些数据,返回了 5 条数据;
      2. 事务 B 插入了新的满足同样条件的数据;
      3. 事务 A 因为业务需要再次读取数据,此次返回了 6 条数据,多出的数据就好像是“幻影”(Phantom)一样;

      可以看到,“幻读”和“不可重复读”有点类似,两者都是在事务 A 过程中需要读取多次数据,但是期间数据被另一个事务 B 篡改,导致多次读到的数据不一致。
      不同点在于,“不可重复读”是数据“值”的不一致,而“幻读”是数据记录的“数量”的不一致。

    • 丢失修改(Lost to modify):

      1. 事务 A 和 事务 B 都要修改数据 num=2;
      2. 事务 A 和 事务 B 同时读到 num=2;
      3. 事务 A 把数据 num 减一变成 num=1;
      4. 事务 B 也把数据 num 减一,但确是在读到的初始值上减一(num=2-1=1),而不是在事务 A 的基础上减一(num=1-1=0)。

      这样,事务 A 的操作结果被事务 B 的操作结果覆盖了,相当于事务 A 对数据的修改“丢失”了。

    • 事务隔离级别

        事务的隔离级别,就是能够避免在事务并发条件下产生的“不良反应”的能力,就是事务能隔绝其它事务的影响的能力。
        事务的隔离级别越高,规避风险的能力也越强,事务在并发环境下出现的“不良反应”的概率越低。
        “隔离级别越低,事务请求的锁越少或保持锁的时间就越短。”——《xx内幕InnoDB引擎》
        “事务的隔离级别”,表示的是一种规范、约束,不同的数据库的具体实现都不一致,不同数据库采取不同的措施来保证事务达到对应的隔离级别。

    

MySql中包含四级的事务隔离级别,如下:

读未提交

  READ-UNCOMMITTED,简写“RU”。应该扩展为“read uncommitted record”,即“可读未提交的记录”。表示在一个事务未提交时,另一个事物被允许读取相关的数据。
  这是最低的隔离级别,相当于啥也没干,自然地,上述的“不良反应”在这种情况下都会发生。

读已提交

  READ-COMMITTED,“read committed record”,“只能读已提交的记录”,简写“RC”。在一个事务提交后,另一个才被允许读取相关数据。
  在这种级别下,当一个事务修改了数据,产生了“脏数据”,而该事务又尚未提交时,另一个事务不被允许去读取相关的数据,自然地这就解决了“脏读的问题”。

  读已提交只允许读已提交的数据,避免了脏读现象。但是存在以下情况:在事务T1内,读取了数据D值为D1,然后T1执行其他SQL,事务T2更新了D为D2并提交,此时T1再次读取D时值为D2。这种情况称为不可重复读。

可重复读

  REPEATABLE-READ,简写“RR”。这种隔离级别下,需要保证一个事务内多次读取某个记录,其数据都是一致的。该级别杜绝了“脏读”和“不可重复读”的问题。

可重复读只允许读已提交数据,而且在一个事务两次读取一个数据项期间,其他事务不得更新该数据,避免了不可重复读现象。虽然其他事务不得更新该数据,但是并未禁止不得插入新数据,这使得在一个事务内,两次同样的SELECT语句读取的记录数量是不一致的,这种情况称为幻读。

序列化

  SERIALIZABLE,在这种隔离级别下,事务串行执行,能够解决“脏读”、“不可重复读”、“幻读”、“丢失修改”的问题,当然,因为是串行执行,所以它的性能是最低的。

MySQL中这四种隔离级别的字符、数字编号表示如下:

四种隔离级别说明

 
隔离级别 丢失更新 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
未提交读(Read uncommitted) 不可能 可能 可能 可能
已提交读(Read committed) 不可能 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 不可能 可能
可串行化(SERIALIZABLE) 不可能 不可能 不可能 不可能

脏读 :一个事务读取到另一事务未提交的更新数据

不可重复读 : 在同一事务中,多次读取同一数据返回的结果有所不同, 换句话说, 后续读取可以读到另一事务已提交的更新数据. 相反, “可重复读”在同一事务中多次读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据。

幻读 :一个事务读到另一个事务已提交的insert数据

原文链接:https://www.cnblogs.com/jian-gao/p/10795407.html

MySql(Innodb)事务隔离级别的更多相关文章

  1. 重新学习MySQL数据库8:MySQL的事务隔离级别实战

    重新学习Mysql数据库8:MySQL的事务隔离级别实战 在Mysql中,事务主要有四种隔离级别,今天我们主要是通过示例来比较下,四种隔离级别实际在应用中,会出现什么样的对应现象. Read unco ...

  2. mysql事务之一:MySQL数据库事务隔离级别(Transaction Isolation Level)及锁的实现原理

    一.数据库隔离级别 数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数 ...

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

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

  4. 【MySQL】事务隔离级别及ACID

    注:begin或start transaction并不是一个事务的起点,而是在执行它们之后的第一个操作InnoDB表的语句,事务才真正开始.start transaction with consist ...

  5. 一文读懂MySQL的事务隔离级别及MVCC机制

    回顾前文: 一文学会MySQL的explain工具 一文读懂MySQL的索引结构及查询优化 (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论不一定适用于其他版本) 就软件开 ...

  6. 【Java面试】请你简单说一下Mysql的事务隔离级别

    一个工作了6年的粉丝,去阿里面试,在第一面的时候被问到"Mysql的事务隔离级别". 他竟然没有回答上来,一直在私信向我诉苦. 我说,你只能怪年轻时候的你,那个时候不够努力导致现在 ...

  7. MySQL之事务隔离级别--转载

    转自:http://793404905.blog.51cto.com/6179428/1615550 本文通过实例展示MySQL事务的四种隔离级别. 1 概念阐述 1)Read Uncommitted ...

  8. mysql数据库——事务隔离级别

    四种隔离级别: 一:READ UNCOMMITTED(未提交读) 事务可以读取其他事务未提交的数据,称为脏读 二:READ COMMITTED(提交读) 一个事务开始时,只能"看见" ...

  9. InnoDB事务隔离级别

    转载于:http://blog.csdn.net/wudongxu/article/details/8623610 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的 ...

  10. MySQL数据库事务隔离级别(Transaction Isolation Level)

    转自: http://www.cnblogs.com/zemliu/archive/2012/06/17/2552301.html  数据库隔离级别有四种,应用<高性能mysql>一书中的 ...

随机推荐

  1. 如何基于surging架设流媒体视频推流(视频讲解)

    前言 随着直播行业大火,各种直播类产品和产品层出不穷,能够满足各方人员的需求和互动,也使得斗鱼.虎牙.抖音都随着直播业的大火而欣欣向荣, 大家也对直播平台了解不少,也参与使用,但是怎么样才能研发出视频 ...

  2. Python基础篇(数据类型)

    str(字符串) Python中最常用的数据类型就是字符串,其用途也很多,我们可以使用单引号 ''或者双引号""来创建字符串.字符串是不可修改的.关于字符我们从 创建.索引.切片. ...

  3. js RGB转HSV

    function rgb2hsv (r,g,b) { var computedH = 0; var computedS = 0; var computedV = 0; //remove spaces ...

  4. RocketMQ主从同步原理

    一. 主从同步概述 主从同步这个概念相信大家在平时的工作中,多少都会听到.其目的主要是用于做一备份类操作,以及一些读写分离场景.比如我们常用的关系型数据库mysql,就有主从同步功能在. 主从同步,就 ...

  5. ProxyKit服务器http反向代理应用

    方法一:这个方法很漂亮,但是,有问题,不知道什么原因,cookie偶尔会收不到,而造成验证错误,提交内容也会错误 扩展类: public class MyTypedHandler : IProxyHa ...

  6. 使用Docker安装Odoo 17(非Docker Compose)

    使用Docker安装Odoo 17(非Docker Compose) 前言 最近在学习Odoo,先是windows 安装企业版,多年不用windows的服务器操作系统,一看windows的ECS那么贵 ...

  7. const与指针的组合

    ① const int *p; //指向一个整型常量的指针,p可变,p指向的对象不可变. ② int const *p; //同上. ③ int * const p; //p不可变,p指向的对象可变( ...

  8. 逻辑卷缩容报错 xfs_growfs: /dev/new/new_box is not a mounted XFS filesystem

    [root@server ~]# xfs_growfs /dev/new/new_box xfs_growfs: /dev/new/new_box is not a mounted XFS files ...

  9. Scaling Memcache at Facebook

      Memcached 是一种众所周知的.简单的内存缓存解决方案.本文描述了 Facebook 如何利用 memcached 作为构建块来构造和扩展一个分布式键值存储支持世界上最大的社交网络. 1.I ...

  10. win10 chrome 百分浏览器 centbrowser 收藏夹栏字体突然变小

    win10 chrome 百分浏览器 centbrowser 收藏夹栏字体突然变小 解决方法: 在"开始" >"设置" >"轻松使用&qu ...