Mysql事务隔离级别

Posted 夏覓

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql事务隔离级别相关的知识,希望对你有一定的参考价值。

一、事务指的是什么?

事务可以看作一个业务逻辑处理单元,这个单元要么执行,要么不执行。

二、ACID的原则

  (1)、原子性(Automicity)

  (2)、一致性(Consistency)

  (3)、隔离性(Isolation)

  (4)、持久性(Durability)

三、mysql事务隔离级别

3.1 读未提交

事务A对数据库做的没有提交的操作事务B也能读取,读到的是脏数据。脏数据理解

3.2 读已提交

事务B只能读取事务A已经commit的操作,在事务A没提交前事务B看不到A所做的更改。该级别不支持可重复读,大多数数据库默认该级别。

不可重复读:在事务A没提交前事务B看不到A所做的更改,在事务A提交后事务B能看到A所做的更改,因为事务A更改了数据导致事务B两次查看的内容前后不一致,这就是不可重复读。

3.3 可重复读

不管事务A对数据做什么操作并提交(比如增删改),事务B重复地查看该数据都和它第一次的查看结果一样。该级别可能产生幻读,mysql默认为该级别。

幻读:

有空表table_student(id,name ),id为主键;

事务A和事务B同时查看表内容,都发现为空;

首先事务A向table_student插入一行id为1的数据并提交,然后事务B查看表内容,发现为空(和它第一次的查看结果一样)

再然后事务B向table_student插入一行id为1的数据并提交,问题来了,提交失败,报错:主键冲突。可是事务B插入前查看表内容明明为空啊,见鬼!!

那就再查看一次内容吧,事务B再次查看表内容,还是空的啊(可重复读,在事务中第一次查询为空,以后次次都是空,重复查询的结果相同)!!!可插入却报主键冲突,就是插入不进,这就是幻读。

不可重复读侧重表达 读-读,幻读则是说 读-写,用写来证实读的是鬼影。

3.4 串读

事务A对table_student进行操作,比如读写操作,但不提交,此时事务B也想向table_student进行操作,发现所在会话陷入等待,如果A一直未提交,则B可能会等待超时。这是最严格的级别。

这就最高级别的隔离机制,它通过强制事务排序,使其步能相互冲突,从而解决了幻读问题。
简单的说:它是在每个读数据行加上了一个共享锁,在这个级别,可能导致大量的超时现象和锁竞争.

以上是关于Mysql事务隔离级别的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的默认事务隔离级别是?

图解MySQL事务隔离级别

MySQL-8事务与隔离级别IO

MySQL事务隔离级别

数据库事务隔离级别 一般用哪个

MySQL 是如何实现四大隔离级别的