苹果越分享越少,知识越分享越多
事务的ACID四大特性
原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不执行。
一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其它事务隔离开来,防止数据损坏。
持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。
四种事务隔离级别
Read uncommitted
《高性能mysql》中对 Read uncommitted 级别的描述

image.png
- 简称 RU 级别
- 在该级别事务中的对数据的修改,即使没有提交,对其他事务也是可见的
- 在该级别下会出现 脏读、不可重复度、幻读、更新丢失的事务并发问题
- 将当前会话设置成 Read uncommitted 级别
set session transaction isolation level read uncommitted;
Read committed
《高性能mysql》中对 Read committed 级别的描述

image.png
- 简称 RC 级别
- 该级别解决了脏读的问题。但是事务中会读到其他事务已提交的数据,无法保证
读一致性,会造成不可重复读的问题。 - 在该级别下会出现 不可重复读、幻读、更新丢失 的事务并发问题
- 将当前会话设置成 Read committed
set session transaction isolation level read committed;
Repeatable read [rɪˈpiːtəbl]
《高性能mysql》中对 Repeatable read 级别的描述

image.png
- 简称 RR 级别
- RR 是 mysql的默认隔离级别
- 该隔离级别下mysql的 innodb引擎 使用
MVCC机制保证了事务中的快照读一致性。不能完全杜绝幻读,还是会出现一个幻读的情况。当我们是用insert(当前读)时会出现幻读 - 该级别下会出现 幻读、更新丢失 的事务并发问题;
- 将当前会话设置成 Repeatable Read
set session transaction isolation level repeatable read;
关于mysql中的mvcc机制,我的这篇文章有讲https://www.jianshu.com/p/5f841f3fc288
Serializable
《高性能mysql》中对 Serializable 级别的描述

image.png
- 强制事务
串行执行、对表的任何操作都会上锁,可能导致大量超时和锁竞争 - 在该隔离级别下不会出现所有的事务并发问题
- 将当前会话设置成 Serializable
set session transaction isolation level serializable ;
事务隔离级别和事务并发问题的关系
| 事务隔离级别 | 事务并发问题 |
|---|---|
| Read uncommitted | 脏读、幻读、不可重复读、更新丢失 |
| Read committed | 脏读、幻读、更新丢失 |
| Repeatable read | 幻读、更新丢失 |
| Read committed | 无 |
关于事务并发问题,我这篇文章有讲
https://www.jianshu.com/p/dcd0be7573ac
命令
- 设置全局的隔离级别,最好重启服务应用更改
set global transaction isolation level read committed; //全局的
- 查询全局和当前会话的事务隔离级别
SELECT @@global.tx_isolation, @@tx_isolation;