事务隔离级别

2020-08-05  本文已影响0人  南国的小狼

本文主要为了总结事务隔离级别的整体知识,包含模拟脏读、不可重复读和幻读的场景

1. 什么是事务隔离级别?

什么是事务?

要了解什么是事务隔离级别,需要先了解什么事务,可参考 百度百科-数据库事务 的概念解释,简单来说:

数据库事务,描述的是对数据库进行读写操作的一个操作序列,要么全部执行,要么全都不执行的现象,这个操作序列是原子性的、不可分割的工作单元

并且数据库事务包含如下 4 个经典特性,也就是常说的 ACID 特性:

为什么要有事务隔离级别?

数据库的事务经常需要并发执行,也即经常会有多个客户端连接到数据库上来进行读写操作,并发事务下会发生如下几种问题:

其中,丢失更新的问题是由于临界资源使用不当造成(同一条数据被并发修改,该条数据应被视为共享临界资源,需要使用者控制好加锁方式),可通过加锁方式来解决

而脏读、不可重复读和幻读,则需要通过事务隔离级别的控制来加以解决,通过不同级别的事务隔离级别,来解决相应的脏读、不可重复读和幻读问题,而事务隔离级别越高,在并发事务场景下会产生的问题就越少,但数据库付出的性能消耗也就越大,并发能力也就越低,因此需要根据不同场景设置不同的事务隔离级别,在事务并发性和数据库性能之间做一个平衡

什么是事务隔离级别?

了解了什么是事务,以及为什么要有事务隔离级别之后,我们再来回答什么是事务隔离级别,就比较轻松了:

在 SQL-92 标准中定义了并发事务场景下脏读、不可重复读和幻读这三种异常情况,而为了解决这些异常情况,SQL-92 标准还定义了 4 种隔离级别来解决这些异常,具体有哪 4 种隔离级别可参照下文

所以简单说,事务隔离级别就是为了解决并发事务场景下脏读、不可重复读和幻读异常而提出的一种应对方式

2. 事务隔离级别有哪些,解决了什么问题?

数据库的事务隔离级别主要有以下 4 种:

不同事务隔离级别能解决的异常情况,表格展示如下:

事务隔离级别 脏读 不可重复读 幻读
读未提交(READ UNCOMMITTED) 允许 允许 允许
读已提交(READ COMMITTED) 不允许 允许 允许
可重复读(REPEATABLE READ) 不允许 不允许 允许
串行化(SERIALIZABLE) 不允许 不允许 不允许

3. 事务隔离级别的查看与修改

以 MySQL 引擎为例进行说明

查看 MySQL 引擎事务隔离级别

通过如下 sql 可查看 MySQL 引擎的事务隔离级别:

-- 查询 MySQL 引擎事务隔离级别变量设置,适用于所有版本的 MySQL 引擎查询
SHOW VARIABLES LIKE '%isolation%';

-- 直接查询 MySQL 事务隔离级别变量设置,需明确 MySQL 引擎版本,不同版本的变量设置不一样,可参考下文表格(示例为 5.6 版本)
SELECT @@tx_isolation;

不同版本的 MySQL 引擎(可通过 select version() 查询 MySQL 版本),事务隔离级别变量的设置不一致,以表格形式进行展示:

MySQL 引擎版本 事务隔离级别变量
5.6 tx_isolation
5.7 tx_isolation, transaction_isolation
8.0.19 transaction_isolation

修改MySQL 引擎事务隔离级别

事务隔离级别的参数包含如下 4 种:

按照修改生效的作用于区分,可分为如下两种修改:

4. 使用 MySQL 客户端模拟脏读、不可重复读、幻读

模拟脏读

可参考 廖雪峰-事务-脏读示例演示,示例简单,清晰明了,包含简短视频演示

模拟不可重复读

可参考 廖雪峰-事务-不可重复读示例演示,示例简单,清晰明了,包含简短视频演示

模拟幻读

可参考 廖雪峰-事务-幻读示例演示,示例简单,清晰明了,包含简短视频演示

上一篇 下一篇

猜你喜欢

热点阅读