Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql事务隔离级别

MySQL中的事务隔离级别详解

作者:凭君语未可

在MySQL中,事务(Transaction)是一个执行单元,它要么完全执行,要么完全回滚,以保证数据的完整性和一致性,下面给大家介绍MySQL中的事务隔离级别详解,感兴趣的朋友一起看看吧

一、事务并发问题

在多个事务同时操作同一份数据时,可能会出现以下几种并发问题:

为了避免这些问题,SQL 标准定义了四种事务隔离级别,MySQL 也支持这四种级别。

二、MySQL 事务隔离级别

MySQL 通过 SET TRANSACTION ISOLATION LEVEL 语句来设置事务隔离级别:

SET SESSION TRANSACTION ISOLATION LEVEL <级别>;
SET GLOBAL TRANSACTION ISOLATION LEVEL <级别>;

其中 <级别> 可以是 READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE

1. READ UNCOMMITTED(读未提交)

特点

示例

适用场景

2. READ COMMITTED(读已提交)

特点

示例

适用场景

3. REPEATABLE READ(可重复读)(MySQL 默认级别)

特点

示例

如何解决幻读?

适用场景

4. SERIALIZABLE(可串行化)

特点

示例

适用场景

三、MySQL 默认事务隔离级别

MySQL InnoDB 存储引擎的默认事务隔离级别是 REPEATABLE READ(可重复读),这与 SQL 标准的默认级别(READ COMMITTED)不同。MySQL 通过 MVCC(多版本并发控制)和 间隙锁 解决了幻读问题,因此 REPEATABLE READ 在 MySQL 中比 SQL 标准更强

如果想修改默认的事务隔离级别,可以在 my.cnf(MySQL 配置文件)中修改:

[mysqld]
transaction-isolation = REPEATABLE-READ

或在运行时更改:

SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

四、不同隔离级别对并发问题的影响

隔离级别脏读(Dirty Read)不可重复读(Non-repeatable Read)幻读(Phantom Read)
READ UNCOMMITTED可能发生 ✅可能发生 ✅可能发生 ✅
READ COMMITTED不会发生 ❌可能发生 ✅可能发生 ✅
REPEATABLE READ不会发生 ❌不会发生 ❌可能发生 ✅(MySQL 中不会)
SERIALIZABLE不会发生 ❌不会发生 ❌不会发生 ❌

五、如何选择合适的隔离级别?

总结

MySQL 默认采用 REPEATABLE READ,主要是因为 MySQL 通过 MVCC 解决了大部分的并发问题,既能保持较高的事务隔离级别,又不会影响太多的性能。

MySQL中的事务隔离级别有四种,分别为:

读未提交(Read Uncommitted)

该级别允许事务读取其他事务尚未提交的数据(脏读)。这意味着一个事务可以读取到另一个事务中间状态的数据,可能会导致数据不一致。

读已提交(Read Committed)

该级别保证事务只能读取到已提交的数据,防止脏读。即使如此,仍然允许发生“不可重复读”(在同一事务中两次读取同一数据,值可能不同,因为另一个事务已经修改了数据并提交)。

可重复读(Repeatable Read)

该级别保证在一个事务中多次读取同一数据时,结果始终一致,避免了“不可重复读”。但是,仍然可能会出现“幻读”(即事务读取的结果集发生了变化,因为另一个事务插入了新的记录)。

串行化(Serializable)

这是最高的隔离级别,强制事务串行执行,即事务排队执行,一个事务在完成之前,其他事务无法访问相同的数据。这可以完全避免脏读、不可重复读和幻读,但性能会较低。

到此这篇关于MySQL中的事务隔离级别有哪些的文章就介绍到这了,更多相关mysql事务隔离级别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文