mysql四种隔离级别

jian-gao jian-gao     2022-12-02     188

关键词:

 

事务的 四个特征(ACID)

事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。

1 、原子性。事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做

2 、一致性。事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。

3 、隔离性。一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

4 、持续性。也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

 

Mysql的四种隔离级别


SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

Read Uncommitted(读取未提交内容)

 

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

 

Read Committed(读取提交内容)

 

这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

 

Repeatable Read(可重读)

 

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

 

Serializable(可串行化)

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

 

出现问题

这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如:

脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。

 

不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。

 

幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

 

在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:

技术图片

 


 

测试Mysql的隔离级别

 

下面,将利用MySQL的客户端程序,我们分别来测试一下这几种隔离级别。

 

测试数据库为demo,表为test;表结构:

 

 技术图片

 

两个命令行客户端分别为A,B;不断改变A的隔离级别,在B端修改数据。

 

(一)、将A的隔离级别设置为read uncommitted(未提交读)

set session transaction isolation level read uncommitted;

查看隔离级别是否设置成功

select @@transaction_isolation (mysql版本 8.0 以后)

select @@tx_isolation (mysql版本 8.0 之前)

查看mysql版本 

> status

 

A:启动事务,此时数据为初始状态

 start transaction;

B:启动事务,更新数据,但不提交

 start transaction;

A:再次读取数据,发现数据已经被修改了,这就是所谓的“脏读”

技术图片

 

B:回滚事务

rollback;

 

A:再次读数据,发现数据变回初始状态

 

 技术图片

 

经过上面的实验可以得出结论,事务B更新了一条记录,但是没有提交,此时事务A可以查询出未提交记录。造成脏读现象。未提交读是最低的隔离级别。

 

(二)、将客户端A的事务隔离级别设置为read committed(已提交读)

 set session transaction isolation level read committed;

A:启动事务,此时数据为初始状态

B:启动事务,更新数据,但不提交

A:再次读数据,发现数据未被修改

B:提交事务

A:再次读取数据,发现数据已发生变化,说明B提交的修改被事务中的A读到了,这就是所谓的“不可重复读”

 

经过上面的实验可以得出结论,已提交读隔离级别解决了脏读的问题,但是出现了不可重复读的问题,即事务A在两次查询的数据不一致,因为在两次查询之间事务B更新了一条数据。已提交读只允许读取已提交的记录,但不要求可重复读。

 

(三)、将A的隔离级别设置为repeatable read(可重复读)

 

A:启动事务,此时数据为初始状态

B:启动事务,更新数据,但不提交

A:再次读取数据,发现数据未被修改

B:提交事务

A:再次读取数据,发现数据依然未发生变化,这说明这次可以重复读了

B:插入一条新的数据,并提交

A:再次读取数据,发现数据依然未发生变化,虽然可以重复读了,但是却发现读的不是最新数据,这就是所谓的“幻读”

A:提交本次事务,再次读取数据,发现读取正常了

由以上的实验可以得出结论,可重复读隔离级别只允许读取已提交记录,而且在一个事务两次读取一个记录期间,其他事务部的更新该记录。但该事务不要求与其他事务可串行化。例如,当一个事务可以找到由一个已提交事务更新的记录,但是可能产生幻读问题(注意是可能,因为数据库对隔离级别的实现有所差别)。像以上的实验,就没有出现数据幻读的问题

 

(四)、将A的隔离级别设置为可串行化(Serializable)

A:启动事务,此时数据为初始状态

B:发现B此时进入了等待状态,原因是因为A的事务尚未提交,只能等待(此时,B可能会发生等待超时)

A:提交事务

B:发现插入成功

serializable完全锁定字段,若一个事务来查询同一份数据就必须等待,直到前一个事务完成并解除锁定为止。是完整的隔离级别,会锁定对应的数据表格,因而会有效率的问题。

mysql的四种事务隔离级别(代码片段)

本文实验的测试环境:Windows10+cmd+MySQL5.6.36+InnoDB一、事务的基本要素(ACID)  1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。... 查看详情

mysql的四种事务隔离级别(代码片段)

本文实验的测试环境:Windows10+cmd+MySQL5.6.36+InnoDB一、事务的基本要素(ACID)  1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。... 查看详情

mysql的四种事务隔离级别

一、事务的基本要素(ACID)原子性(Atomicity):即不可分割性,事务要么全部被执行,要么全部不执行一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏。比... 查看详情

mysql原理篇之事务隔离级别和mvcc--13(代码片段)

...前准备事务隔离级别事务并发执行遇到的问题SQL标准中的四种隔离级别MySQL中支持的四种隔离级别如何设置事务的隔离级别MVCC原理版本链ReadViewREADCOMMITTED——每次读取数据前都生成一个ReadViewREPEATABLEREAD——在第一次读取数据时... 查看详情

mysql回表sql优化四种隔离级别三大日志binlogredologundolog

什么是回表?MySQLinnodb的主键索引是簇集索引,也就是索引的叶子节点存的是整个单条记录的所有字段值,不是主键索引的就是非簇集索引,非簇集索引的叶子节点存的是主键字段的值。回表是什么意思?就是你执行一条sql语句... 查看详情

面试官:说一下mysql事务隔离级别?

...已提交。REPEATABLEREAD:可重复读。SERIALIZABLE:序列化。1.四种事务隔离级别1.1READUNCOMMITTED读未提交,也叫未提交读,该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取 查看详情

mysql的事务特性,四种隔离级别及原理(代码片段)

一、事务的基本要素(ACID)1、原子性(Atomicity)事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作... 查看详情

四种事务隔离级别

面试白话文,事务隔离级别事务具有原子性、一致性、隔离型、持久性。使用Mysql数据库说明事务隔离级别:  mysql支持事务的常用引擎是InnoDB  mysql默认事务隔离级别可重复读(REPEATABLE-READ):使用showvariableslike‘tx_isolation... 查看详情

关于数据库中的四种隔离级别

1.readuncommitted可以看到未提交的数据(脏读),举个例子:别人说的话你都相信了,但是可能他只是说说,并不实际做。2.readcommitted读取提交的数据。但是,可能多次读取的数据结果不一致(不可重复读,幻读)。用读写的观点... 查看详情

mysql事务隔离级别(代码片段)

1.隔离级别1.1理论MySQL中事务的隔离级别一共分为四种,分别如下:序列化(SERIALIZABLE)可重复读(REPEATABLEREAD)提交读(READCOMMITTED)未提交读(READUNCOMMITTED)四种不同的隔离级别含义分别如... 查看详情

mysql事务隔离级别(代码片段)

1.隔离级别1.1理论MySQL中事务的隔离级别一共分为四种,分别如下:序列化(SERIALIZABLE)可重复读(REPEATABLEREAD)提交读(READCOMMITTED)未提交读(READUNCOMMITTED)四种不同的隔离级别含义分别如... 查看详情

数据库事务的隔离级别

MySQL数据库为我们提供的四种隔离级别:①Serializable(串行化):可避免脏读、不可重复读、幻读的发生。②Repeatableread(可重复读):可避免脏读、不可重复读的发生。③Readcommitted(读已提交):可避免脏读的发生。④Readuncommitted(读未... 查看详情

mysql隔离级别容易理解的方法(代码片段)

...;就加以修改转来了关于mysql隔离级别的实验简介SQL定义了四种隔离级别。包括READUNCOMMITED(未提交读)READCOMMITED(提交读)REPEATABLEREAD(可重复读)REPEATABLEREA 查看详情

mysql事务特性四种隔离级别(图示每一步的操作)和产生的问题(代码片段)

文章目录一、事务的特性(ACID)二、MySQL事务的隔离级别和产生的问题2.1、隔离级别2.1.1、查看隔离级别2.1.2、设置隔离级别2.2、隔离级别产生的`脏读`、`不可重复读`、`幻读`的问题2.2.1、脏读:2.2.2... 查看详情

面试官:说一下mysql事务隔离级别?(代码片段)

...。REPEATABLEREAD:可重复读。SERIALIZABLE:序列化。1.四种事务隔离级别1.1READUNCOMMITTED读未提交& 查看详情

mysql事务隔离级别(代码片段)

MySQL的四种隔离级别读未提交读提交可重复读串行化隔离级别可以通过MySQL的视图来实现。读未提交读未提交是一个事务仅修改了数据但还未提交时,本次修改可以便可被其他事务查询到变更后的值。读未提交隔离级别下࿰... 查看详情

再谈数据库隔离级别

...rializable 这次我以mysql为例,通过实际操作演示一下这四种隔离级别。笔者使用的mysql版本是5.6.41,我们可以在客户端调用ve 查看详情

mysql事物及隔离级别(代码片段)

阅读目录一、事务的基本要素(ACID)二、事务的四种隔离级别三、事务的并发问题四、MVCC在MySQL的InnoDB中的实现五MySQL死锁六EXPLAIN分析语句七锁的定义一、事务的基本要素(ACID)1、原子性(Atomicity)࿱... 查看详情