MySQL 事务的四种隔离级别简介

学习笔记 马富天 2020-05-31 13:10:31 21 0

【摘要】今天是2020-05-31,周日啊,第一次在周末的时候写文章,因为感觉自己需要恶补一下知识,所以利用这个周末来学习学习,这篇文章主要介绍一下 MySQL 的四种事务隔离级别,并分别对每种隔离级别给出相应的小示例。

首先说一下事务的特点,然后再开启今天的主要内容,事务一共有四个特性(ACID),即:

原子性(Atomicity):事务中的所有操作,要么都执行成功,要么都执行失败。

一致性(Consistency):事务的开启之前和提交之后,能够保证数据的一致性。(比如用户A给用户B转100块,则A的余额减少100,B的余额增加100,如果出现B的余额不增加,那么就出现了数据的不一致性。)

隔离性(Isolation):一个事务的执行不会受到另一个事务的干扰。事务隔离级别就是在这一特性中。

持久性(Durability):一旦事务已提交,对数据的修改是永久的,不可再次被回滚。

在 MySQL 存储引擎为 Innodb 时,是支持事务处理的,而一共有四种隔离级别分别是:

read uncommitted (读取未提交)

read committed (读取已提交)

repeatable read (可重复读)

serializable (可串行话)

以上四种隔离级别依次从上到下隔离级别升高,其中默认的隔离级别是:repeatable read(可重复读)。

用到的基础数据准备:

  1. create table book (id int auto_increment primary key,name varchar(100),count int);
  2. insert into book values(1,'《高性能mysql第三版》',100),(2,'MySQL技 术内幕(第4版)',100);
  3. create table good(id int auto_increment primary key,name varchar(100),price decimal(10,2));
  4. insert good values(1,'华为mate 30',2000.00);

一、read uncommitted(读取未提交)

本隔离级别是最低的,在实际应用中很少使用,因为在这个隔离级别中,可以查询到其它未提交事务的执行结果,会造成脏读(Dirty Read),接下来我们就演示一下脏读的出现。

  1. select @@tx_isolation; -- 查看当前会话的隔离级别
  2. set session transaction isolation level read uncommitted; -- 设置当前隔离级别为 read uncommitted
  3. begin; -- 显示的开启事务(也可以用 start transaction; 或者 set autocommit = 0;)

开始两个事务,其中一个事务1的隔离级别是 read uncommitted,事务2的隔离级别无关紧要,因为事务1是最低级别的,所以在其它任意的隔离级别都会造成脏读问题。请看如下截图所示:

请输入图片名称

二、read committed(读取已提交)

在这个隔离级别中,可以解决脏读的问题,但是会造成不可重复读问题,请看截图:

请输入图片名称

三、repeatable read(可重复读)

这一级别是 MySQL 默认的级别,也是在实际应用中几乎所有开发中使用的级别。这里就可以解决脏读、不可重复读的问题,但是不能解决幻读,也不能完全解决并发问题。

幻读就是针对其它事务种有 insert 操作时,并已提交的情况。

请输入图片名称请输入图片名称

四、serializable (可串行化)

serializable 可串行化是最高级别的,读写数据都会锁住整张表,它可以完美解决 MySQL 并发的所有问题,但是效率极低,所以一般也很少使用。

它可以解决脏读、不可能重复读、幻读等问题,在这里主要演示一下它解决幻读的问题。

  1. set session transaction isolation level serializable;
请输入图片名称

最后总结一下:事务的隔离级别越高,就越能够保证数据的完整性和一致性,但是对性能的影响也越大。

版权归 马富天PHP博客 所有

本文标题:《MySQL 事务的四种隔离级别简介》

本文链接地址:http://www.numberer.net/445.html

转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^

0

0

上一篇《 mysql 自定义变量【用户变量、局部变量】 》 下一篇《 在 MySQL 执行计划中 Using filesort 指的是什么意思? 》

暂无评论

评论审核未开启
表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情
验证码

TOP10

  • 浏览最多
  • 评论最多