专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

MySQL 事务隔离级别

103_1.png

前言

简单来说,数据库事务就是保证一组数据操作要么全部成功,要么全部失败。在 MySQL 中,事务是在引擎层实现的。原生的 MyISAM 引擎不支持事务,也是为什么 InnoDB 会取代它的重要原因之一。

隔离性与隔离级别

当数据库上有多个事务同时执行的时候,根据隔离级别的不同,可能会出现脏读、幻读和不可重复读。标准隔离级别包括读未提交、读提交、可重复读和串行化。

读未提交

如果用这种隔离级别,事务执行的时候会读到其他未提交事务的数据,我们称为脏读。

# 客户端 A
start transaction;
update users set name = 'hello' where id = 1;
select * from users where id = 1; # 此时可以读到 name 已经被更新为 hello

# 客户端 B
start transaction;
select * from users where id = 1; # 此时读到 name 为 hello

在此隔离级别下,客户端 B 读到了客户端 A 还未提交的事务即还未 commit 的事务,即产生的脏读现象。

读提交

如果用这种隔离级别,事务执行的时候会读到其他已提交事务的数据,我们称为不可重复读。

# 客户端 A
start transaction;
update users set name = 'hello' where id = 1;
commit;

# 客户端 B
start transaction;
select * from users where id = 1; # 此时 name 不为 hello
# 此时 客户端 A 完成 commit
select * from users where id = 1; # 此时 name 为 hello

在此隔离级别下,客户端 B 读到了客户端 A 完成提交的事务,产生了不可重复读现象。

可重复读

在同一个事务里,SELECT 语句获得的结果是基于事务开始时间点的状态,同一个事务中 SELECT 语句得到的结果是一样的,但是会有幻读现象。

# 客户端 A
start transaction;
select * from users; # 为空
# 此时客户端 B 完成 commit 操作
select * from users; # 还是为空
insert into users(id, name) value (1, 'hello') # 报主键冲突

# 客户端 B
start transaction;
select * from users; # 为空
insert into users(id, name) values (1, 'hello');
commit;

在此隔离级别下,会产生幻读现象。

串行化

在该事务级别下,事务都是串行顺序执行的,避免了脏读,不可重复读,幻读问题。

# 客户端 A
start transaction;
insert into users(id, name) values (1, 'hello');
commit;

# 客户端 B
start transaction;
select * from users; # 会一直阻塞住,直到客户端 A 完成事务提交

文章永久链接:https://tech.souyunku.com/25942

未经允许不得转载:搜云库技术团队 » MySQL 事务隔离级别

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们