MySQL详解之事务隔离机制与实现原理

文 / @WordPress主题

MySQL详解之事务隔离机制与实现原理

作为一种常见的关系型数据库管理系统,MySQL提供了事务功能,以保证数据的一致性和完整性。而事务的隔离机制是保证这些特性的重要手段之一。本文将详细介绍MySQL的事务隔离机制与实现原理。

一、MySQL事务使用

1、事务的定义和特性

事务是作为单个逻辑工作单元执行的一系列操作。这些操作要么全部完成,要么全部未完成,是一个不可分割的工作单元。例如,在购买商品支付的过程中会有一系列操作,如查询余额、加减、更新余额等。这些操作必须是同时进行的。否则,系统可能会显示你支付成功,但是实际上没有收到钱。

为了保证事务操作的正确性和完整性,每个事务都必须满足ACID特性。ACID是指原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

- 原子性:事务的所有操作要么全部完成,要么全部未完成,不会在中间阶段结束。
- 一致性:在事务之前和之后,数据库的完整性限制不会被打破。
- 隔离性:当多个事务同时访问数据库中的同一数据时,将出现关系。
- 持久性:事务完成后,事务所做的更改将持久保存,不会丢失。

2、MySQL事务的启动方式

MySQL事务的启动方式有以下两种:

3.1、显式启动事务语句

显式启动事务语句包括begin或start transaction。配套的提交语句是commit,回滚语句是rollback。

示例代码如下:

BEGIN; -- 开启事务
INSERT INTO fork_business_detail VALUES (4, '123', '123', '123004', '2022-11-12 17:17:29', '1', '2022-11-12 17:17:37', '1');
COMMIT; -- 提交事务
ROLLBACK; -- 回滚事务

3.2、关闭自动提交

关闭自动提交的命令是set autocommit = 0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个select语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行commit或rollback语句,或者断开连接。

注意:不建议使用这种方式。

示例代码如下:

SET autocommit = 0; -- 关闭自动提交
INSERT INTO fork_business_detail VALUES (4, '123', '123', '123004', '2022-11-12 17:17:29', '1', '2022-11-12 17:17:37', '1');
COMMIT; -- 提交事务
ROLLBACK; -- 回滚事务

二、MySQL事务隔离性与隔离机制

在数据库上同时执行多个事务(可以理解为多任务、并发场景)时,可能会发生脏读、不可重复读和幻读等问题。为了解决这些问题,MySQL引入了“隔离级别”的概念,它是决定在不同的并发情况下,事务是否相互影响的标准。

1、四种隔离级别

SQL标准的事务隔离级别包括:读未提交(read uncommitted) 、读已提交(read committed)、可重复读取(repeatable read)和串行化(serializable)。

- 读未提交(RU,Read Uncommitted):它可以读取事务的中间过程,也就是未提交的操作。它违反了ACID特性,并且存在脏读取的问题,因此基本上不被使用。
- 读已提交(RC,Read Committed):这意味着,如果已经提交了其他事务,我们可以看到这也是最常用的级别。但是,由于一些历史原因,RC可能在生产环境中使用不多。
- 可重复读取(RR,Repeatable Read):它是目前使用最广泛的级别。它的特点是间隙锁定,这仍然是默认级别。在这个级别,死锁、低并发和其他问题经常发生。
- 串行化(Serializable):它是最高级别的隔离级别。它不是多版本实现,而是单版本实现,因为它的所有实现都是通过锁实现的。但因为需要排队等等,所以基本不被使用。

2、并发事务引起的问题

在并发事务执行的过程中,可能会出现以下问题:

- 脏读:事务A读取事务B更新的数据,然后B回滚,导致A读取的数据是脏的。(这个数据实际上不应该存在)
- 不可重复读:事务A多次读取相同的数据。事务B在事务A多次读取的过程中更新并提交数据,导致事务A多次捕获同一数据时结果不一致。一个事务读取到其他事务已提交的数据导致前后两次读取数据不一样的情况。
- 幻读:A查出来数据,此时B提交,A再次查同一数据时结果不一致。一个事务前后两次读取的数据不一致,是因为其他事务插入数据导致的。事务并发情况不可重复读和幻读很容易混淆,不可重复读侧重于修改,而幻读侧重于添加或删除。

为了解决这些问题,MySQL使用了不同的隔离级别和实现机制。

3、隔离级别问题的剖析与演示

3.1 查看MySQL事

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。