3分钟搞懂MySQL事务隔离级别及SET TRANSACTION影响事务

本文介绍了MySQL中InnoDB引擎的事务隔离级别,包括READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE,并通过实例展示了不同隔离级别下的并发行为。通过SET TRANSACTION语句可以设置事务的隔离级别和访问模式,影响事务的隔离效果和数据一致性。
摘要由CSDN通过智能技术生成

导读:MySQL支持SQL:1992标准中的所有事务隔离级别,使用SET TRANSACTION来设置不同的事务隔离级别或访问模式,我们一起实战下它的效果。

我们都知道,MySQL的内置引擎中只有InnoDB、NDB支持事务,而又以InnoDB引擎对于事务的支持最全面也使用最广泛,所以本文的讨论都是基于InnoDB引擎,实验中用的表都是基于InnoDB的表。

Feature MyISAM Memory InnoDB Archive NDB
Transactions No No Yes No Yes

MySQL中可以使用SET TRANSACTION来影响事务特性,此语句可以指定一个或多个由逗号分隔的特征值列表,每个特征值设置事务隔离级别或访问模式。此语句在MySQL 5.7中的完整语法

SET [GLOBAL | SESSION] TRANSACTION    transaction_characteristic [, transaction_characteristic] ...
transaction_characteristic: {    ISOLATION LEVEL level  | access_mode}
level: {     REPEATABLE READ   | READ COMMITTED   | READ UNCOMMITTED   | SERIALIZABLE}
access_mode: {     READ WRITE   | READ ONLY}

语法很简单清晰,这里有几个关键概念需要理解清楚。

  • Transaction Isolation Levels(事务隔离级别)


事务隔离是数据库的基础能力,ACID中的I指的就是事务隔离,通俗点讲就是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

那么到底如何做才算是相互隔离呢?SQL:1992标准规定了四种事务隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。

InnoDB对四种隔离级别都支持,默认级别是REPEATABLE READ。

root@database-one 07:43:  [(none)]> select @@tx_isolation;+-----------------+| @@tx_isolation  |+-----------------+| REPEATABLE-READ |+-----------------+1 row in set (0.00 sec)

新建会话进行验证,会话的默认隔离级别确实REPEATABLE-READ。

InnoDB是靠不同的锁策略实现每个事务隔离级别,隔离级别越高付出的锁成本也就会越高。我们通过例子来看看不同级别的区别。

root@database-one 08:38:  [gftest]> create table testtx(name varchar(10),money decimal(10,2)) engine=innodb;Query OK, 0 rows affected (0.12 sec)
root@database-one 08:42:  [gftest]> insert into testtx values('A',6000),('B',8000),('C',9000);Query OK, 3 rows affected (0.00 sec)Records: 3  Duplicates: 0  Warnings: 0
root@database-one 08:43:  [gftest]> select * from testtx;+------+---------+| name | money   |+------+---------+| A    | 6000.00 || B    | 8000.00 || C    | 9000.00 |+------+---------+3 rows in set (0.00 sec)

上面创建了表testtx,并插入了3条数据,表示A有6000元,B有8000元,C有9000元。

REPEATABLE READ,同一事务内的consistent reads读取由第一次读取建立的快照。这意味着,如果在同一事务中发出多个普通(非锁定)SELECT语句,则这些SELECT语句查到的数据保持一致。

创建会话1,关闭MySQL默认的事务自动提交模式(相关知识可以参考MySQL中的事务控制语句,地址:https://www.modb.pro/db/23348)。

root@database-one 08:58:  [(none)]> prompt \u@database-one \R:\m:\s [\d] session1>PROMPT set to '\u@database-one \R:\m:\s [\d] session1>'root@database-one 08:58:41 [(none)] session1>use gftest;Database changedroot@database-one 08:58:55 [gftest] session1>SET autocommit=0;Query OK, 0 rows affected (0.00 sec)
root@database-one 08:59:21 [gftest] session1>show variables like 'autocommit';+---------------+-------+| Variable_name | Value |+---------------+-------+| autocommit    | OFF   |+---------------+-------+1 row in set (0.02 sec)
root@database-one 08:59:36 [gftest] session1>select * from testtx;+------+---------+| name | money   |+------+---------+| A    | 6000.00 || B    | 8000.00 || C    | 9000.00 |+------+---------+3 rows in set (0.00 sec)

创建会话2,关闭MySQL默认的事务自动提交模式(相关知识可以参考MySQL中的事务控制语句,地址:https://www.modb.pro/db/23348)。

root@database-one 09:01:  [(none)]> prompt \u@database-one \R:\m:\s [\d] session2>PROMPT set to '\u@database-one \R:\m:\s [\d] session2>'root@database-one 09:02:13 [(none)] session2>use gftest;Database changedroot@database-one 09:02:24 [gftest] session2>SET autocommit=0;Query OK, 0 rows affected (0.00 sec)
root@database-one 09:02:30 [gftest] session2>show variables like 'autocommit';+---------------+-------+| Variable_name | Value |+---------------+-------+| autocommit    | OFF   |+---------------+-------+1 row in set (0.00 sec)
root@database-one 09:02:37 [gftest] session2>select * from testtx;+------+---------+| name | money   |+-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值