mysql事务隔离级别详解

 更新时间:2023年06月16日 08:42:27   作者:CrazyPixel  
MySQL事务隔离级别是指在多个事务同时执行时,数据库系统如何处理这些事务之间的相互影响。MySQL提供了四种隔离级别:读未提交、读已提交、可重复读和串行化。每种隔离级别都有其优缺点,需要根据具体情况选择合适的级别。

0. 事务的概念

事务指的是一连串的集中操作指令,一个事务的执行必须执行完所有的动作才能算作执行结束。事务具有四个特点,简记作ACID

  • A-Atomicity: 原子性,事务的执行必须保证所有的动作都执行完毕;
  • C-Consistency: 一致性,事务的执行必须保证数据的一致性;
  • I-Isolation: 隔离性,事务的执行必须保证数据的隔离性;
  • D-Durability: 持久性,事务的执行必须保证数据的持久性。

而事务隔离级别则是在大型数据库多个事务执行的过程中,针对事务并行进行的机制设计,主要是围绕Isolation进行设计的。

1. 三类问题

  • 脏读
    • 过程:
      • 事务A正在写某一行数据,未提交;
      • 事务B并行读取该行数据,用于操作;
      • 事务A撤销写操作,这是对于事务B来说,之前的读操作就是错误的。
    • 读事务读取了写事务未提交的数据,而造成错误读取。
    • 举例
      • 小明今天发工资,一开始在财务系统上查询是工资50000元,很高兴地准备买新电脑,但是这是财务正在敲数据的时候一时疏忽,实际上工资只有5000元,财务在审核数据准备提交的时候发现了这个错误并修改过来,小明很失望。
      • 这里的小明就是读事务,财务就是写事务
  • 不可重复读
    • 过程:
      • 事务B读取的是数据库中的某一行数据,用于操作;
      • 事务A开始对这行数据进行写操作并完成,数据库的数据改变;
      • 事务B再次读该数据库的这一行数据,发现数据改变;
    • 读事务两次读同一行数据,但是两次读取的数据并不一致。
    • 举例
      • 小明和小红打赌,这个月工资是1k,两个人几乎同时发出查询请求,但是小明先读取到了原始数据是1k,而财务核对之后再次修改了工资为2k,小红在这之后才并发读取到工资是2k,两人认为读操作是并行的,同时进行,虽然知道这中间可能是财务进行了修改,但是两人都认为自己读取的才是最终数据,因此吵了起来。
  • 幻读
    • 过程
      • 事务B读取数据库中的一批数据,用于操作;
      • 事务A添加了一行数据,并完成操作,数据库的数据改变;
      • 事务B再次读该数据库的数据,发现这一批数据改变;
    • 读事务两次读取同一行数据,但是两次读取的数据不一致。(这和不可重复读操作是一致的)。
    • 举例
      • 小明被领导要求,改动财务系统上的ID数据格式,从A格式全都转为B格式,小明读取数据库中的数据之后开始修改,这时候,财务发现新来了一位员工叫小红,于是把小红的记录添加在财务系统上,ID格式依然是A格式。小明工作完成之后给领导看,领导却发现有一个人的数据没有改过来,很是恼火,把小明批评了一番。
    • 幻读和不可重复读的区别
      • 幻读是针对同一批数据,不可重复读针对的是同一行数据

2. 事务隔离级别

  • 读未提交(read uncommitted)
  • 一个事务在写某一行数据的时候,允许其他事务并行读取该行数据,但是不允许写该行数据;
  • 允许多个事务并行读取数据库中的数据,但是不允许并行写入某一行数据;
  • 可能会出现脏读:
  • 解决方案:排他锁
  • 读已提交(read committed)

    • 一个事务在写某一行数据的时候,不允许其他事务读或者写该行数据;
    • 允许多个事务并行读取数据库的数据;
    • 可能都造成不可重复读
  • 可重复读(repeatable read)

    • 一个事务在读数据的时候,其他事务不允许写,可以读。
    • 一个事务在写数据的时候,其他事务不可以读或者写。
    • 可能会造成幻读
    • MySQL默认的隔离级别。
  • 串行化(serializable)

    • 一个事务一个事务串行执行,不允许任何事物并行;
    • 能够解决幻读不可重复读脏读的问题;
    • 成本高,一般不适用

3. 操作指令

查看当前的隔离级别

SELECT @@tx_isolation;

设置隔离级别

 set  [glogal | session]  transaction isolation level 隔离级别名称;//方式1
 set tx_isolation='隔离级别名称';//方式2
``

4. 总结

对前期的事务隔离级别做一个表格梳理

img
mysql事务隔离级别详解

5. 参考博文

MySQL事务隔离级别是保证数据一致性和并发性的重要手段。不同的隔离级别适用于不同的场景,需要根据实际情况进行选择。在使用事务时,需要注意事务的提交和回滚,以及锁的使用和释放,以保证数据的正确性和系统的稳定性。

到此这篇关于mysql事务隔离级别详解的文章就介绍到这了,更多相关MySQL事务隔离级别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详细深入聊一聊Mysql中的int(1)和int(11)

    详细深入聊一聊Mysql中的int(1)和int(11)

    mysql数据库作为当前常用的关系型数据库,肯定会遇到设计表的需求,下面对设计表时int类型的设置进行分析,下面这篇文章主要给大家介绍了关于Mysql中int(1)和int(11)的相关资料,需要的朋友可以参考下
    2022-08-08
  • mysql如何查询重复数据并删除

    mysql如何查询重复数据并删除

    这篇文章主要介绍了mysql如何查询重复数据并删除问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 细说MySQL死锁与日志二三事

    细说MySQL死锁与日志二三事

    这篇文章主要和大家一起聊一聊MySQL死锁与日志二三事,实际业务当中如何快速的定位线上MySQL问题,修复异常?本文根据两个实际case,分享下相关的经验与方法,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • MySQL下海量数据的迁移步骤分享

    MySQL下海量数据的迁移步骤分享

    一般mysql小数据的情况可以通过直接复制目录,或者通过帝国备份工具,如果是海量数据(6亿)该怎么处理呢,下面看下别人是怎么处理的参考一下
    2013-10-10
  • MySQL Limit性能优化及分页数据性能优化详解

    MySQL Limit性能优化及分页数据性能优化详解

    今天小编就为大家分享一篇关于MySQL Limit性能优化及分页数据性能优化详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • mysql实现递归查询的方法示例

    mysql实现递归查询的方法示例

    本文主要介绍了mysql实现递归查询的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • MySQL 创建索引(Create Index)的方法和语法结构及例子

    MySQL 创建索引(Create Index)的方法和语法结构及例子

    MySQL 创建索引(Create Index)的方法和语法结构及例子
    2009-07-07
  • mysql mysqldump只导出表结构或只导出数据的实现方法

    mysql mysqldump只导出表结构或只导出数据的实现方法

    mysql mysqldump只导出表结构或只导出数据的实现方法,需要的朋友可以参考下。
    2011-11-11
  • MySQL切分函数substring()的具体使用

    MySQL切分函数substring()的具体使用

    这篇文章主要介绍了MySQL切分函数substring()的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 简单了解MySQL存储引擎

    简单了解MySQL存储引擎

    这篇文章主要介绍了MySQL存储引擎的相关资料,为开发时选择合适的存储引擎提供参考,感兴趣的朋友可以了解下
    2020-07-07

最新评论