MySQL-8.0 事务隔离级别

MySQL-8.0 事务隔离级别

查看数据库事务隔离级别

mysql> show variables like 'transaction%';
mysql> select @@transaction_isolation;
mysql> SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
mysql> SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;

修改事务隔离级别的方式

  • 由低到高分别为
  1. read uncommitted (读未提交)
  2. read committed (读已提交)
  3. repeatable read (可重复)
  4. Serializable (可串行化)

1.只在本次会话有效

mysql> set session transaction isolation level read committed;

2.设置全局的事务隔离级别,该设置不会影响当前已经连接的会话,新会话,将使用新设置的事务隔离级别

mysql> set global transaction isolation level read committed;

3.修改配置文件,重启后生效

[mysqld]
transaction-isolation = REPEATABLE-READ
transaction-read-only = OFF
select id,name,count from ent_stock;
select id,name,count from ent_stock lock in share mode;
update ent_stock s set s.count = s.count-1 where s.name = '库存-1';
insert into ent_stock(id,name,count) values(uuid(),'库存-3',1000);
级别脏读不可重复读幻读
read uncommitted (读未提交)
read committed (读已提交)
repeatable read (可重复读)
Serializable (可串行化)

read uncommitted (读未提交)

初始数据:
开两个mysql窗口

在这里插入图片描述
设置事务级别
在这里插入图片描述

Transication ATransication B
begin
centered 文本居中
在这里插入图片描述
commit
在这里插入图片描述在这里插入图片描述

rollback:

Transication ATransication B
begin
centered 文本居中
在这里插入图片描述
rollback;在这里插入图片描述
在这里插入图片描述

read committed (读已提交)

设置事务级别

在这里插入图片描述

Transication ATransication B
begin
centered 文本居中
在这里插入图片描述
commit
在这里插入图片描述在这里插入图片描述

rollback:

Transication ATransication B
begin
centered 文本居中
在这里插入图片描述
rollback;在这里插入图片描述
在这里插入图片描述
<think>嗯,用户现在问的是MySQL默认的事务隔离级别。我需要先确认自己对这个知识点的掌握程度,然后再组织回答。 首先,用户之前问过一个关于SQL查询返回null的问题,现在转向事务隔离级别,可能是在学习数据库相关知识,或者在开发中遇到了相关问题。用户可能是开发者,需要了解MySQL的默认设置,以便正确使用事务,避免并发问题。 接下来,我得回忆一下MySQL的默认事务隔离级别。记得在MySQL中,默认的隔离级别是可重复读(REPEATABLE READ)。但需要确认这一点是否正确,因为不同的数据库可能有不同的默认设置,比如PostgreSQL默认是读已提交(READ COMMITTED)。不过对于MySQL,尤其是InnoDB引擎,确实是可重复读。 然后需要解释什么是事务隔离级别,以及不同级别的区别。用户可能对ACID属性中的隔离性不太清楚,或者需要了解为什么选择某个隔离级别。可能需要简要说明四个隔离级别:读未提交、读已提交、可重复读、串行化,以及它们解决的问题,如脏读、不可重复读、幻读。 还要提到InnoDB引擎在可重复读下的实现,比如使用MVCC(多版本并发控制)来避免幻读,虽然在标准SQL中可重复读并不能完全防止幻读,但InnoDB通过Next-Key锁做到了这一点。这可能是一个需要注意的细节,避免用户误解。 此外,用户可能想知道如何查看和修改事务隔离级别,是否需要给出相关命令,比如SELECT @@transaction_isolation; 或者SET TRANSACTION ISOLATION LEVEL。不过用户的问题只是问默认级别,可能不需要深入这部分,但稍微提一下会更好,帮助用户进一步操作。 同时,可能需要说明默认隔离级别的优缺点,比如可重复读在并发性能和数据一致性之间的平衡。用户可能关心在什么情况下需要调整隔离级别,比如高并发场景下是否适合,或者是否需要更高的隔离级别来保证数据准确性。 另外,还要考虑用户可能的误区,比如认为可重复读完全不会出现幻读,但实际在MySQL中因为InnoDB的实现,确实在大多数情况下避免了幻读,但并非所有情况。或者用户可能混淆了不同数据库的默认设置,需要明确指出这是MySQL的特性。 最后,总结一下,确保回答清晰,结构合理,从定义、默认值、不同级别对比、实现机制、相关命令到应用场景,逐步展开,让用户能够全面理解。同时语言要简洁,避免过于技术化的术语,必要时举例说明。</think>MySQL 默认的事务隔离级别是 **可重复读(Repeatable Read)**。以下是详细说明: --- ### **1. 什么是事务隔离级别?** 事务隔离级别定义了多个并发事务之间如何相互“隔离”,决定了事务能看到其他事务的哪些修改。它解决了以下并发问题: - **脏读**(Dirty Read):读取到其他事务未提交的数据。 - **不可重复读**(Non-Repeatable Read):同一事务中多次读取同一数据,结果不一致。 - **幻读**(Phantom Read):同一事务中多次查询同一范围的数据,结果集的行数不一致。 --- ### **2. MySQL 的默认隔离级别** - **默认值**:`REPEATABLE READ`(可重复读)。 可通过以下命令查看当前隔离级别: ```sql SELECT @@transaction_isolation; -- MySQL 8.0+ -- 或 SELECT @@tx_isolation; -- MySQL 5.x ``` --- ### **3. 四个标准隔离级别对比** | 隔离级别 | 脏读 | 不可重复读 | 幻读 | 性能 | |----------------------|------|------------|------|------| | **READ UNCOMMITTED** | ❌ | ❌ | ❌ | 最高 | | **READ COMMITTED** | ✅ | ❌ | ❌ | 较高 | | **REPEATABLE READ** | ✅ | ✅ | ❌ | 中等 | | **SERIALIZABLE** | ✅ | ✅ | ✅ | 最低 | --- ### **4. 为什么 MySQL 默认是 `REPEATABLE READ`?** - **平衡性能与一致性**: - 相比 `READ COMMITTED`,`REPEATABLE READ` 避免了不可重复读的问题。 - 相比 `SERIALIZABLE`,性能更高,适合大多数业务场景。 - **InnoDB 的实现优化**: - 通过 **多版本并发控制(MVCC)** 和 **Next-Key 锁**,在 `REPEATABLE READ` 下也能部分解决幻读问题(并非完全避免,但大多数场景下足够安全)。 --- ### **5. `REPEATABLE READ` 的实际效果** - **同一事务内**:多次读取同一数据的结果始终一致(即使其他事务已提交修改)。 - **幻读的争议**: - 标准 SQL 中 `REPEATABLE READ` 允许幻读,但 **InnoDB 引擎通过 Next-Key 锁** 减少了幻读的发生。 - 严格来说,InnoDB 的 `REPEATABLE READ` 隔离级别比标准定义更严格。 --- ### **6. 如何修改隔离级别?** 在配置文件 `my.cnf` 中全局设置: ```ini [mysqld] transaction-isolation = READ-COMMITTED ``` 或在会话中临时修改: ```sql SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; ``` --- ### **7. 适用场景** - **适合**:需要事务内数据一致性(如账户余额查询),但对绝对幻读容忍度较高的场景。 - **不适合**:对幻读敏感的场景(如库存精确扣减),需升级到 `SERIALIZABLE` 或通过业务逻辑控制。 --- ### **总结** MySQL 默认的 `REPEATABLE READ` 隔离级别在性能和数据一致性之间取得了平衡,是 InnoDB 引擎的推荐选择。理解其特性有助于设计高并发场景下的安全事务逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值