推荐链接:
总结——》【Java】
总结——》【Mysql】
总结——》【Redis】
总结——》【Kafka】
总结——》【Spring】
总结——》【SpringBoot】
总结——》【MyBatis、MyBatis-Plus】
Mysql——》事务的隔离级别
并发事务执行过程中可能遇到的一些问题,按照严重性来排一下序:脏读 > 不可重复读 > 幻读。
隔离级别越低,越严重的问题就越可能发生。
一、事务的隔离级别定义
事务隔离级别指的是一个事务对数据的修改与另一个并行的事务的隔离程度。
Q:数据库的事务隔离越严格越好吗?
A:数据库的事务隔离越严格,并发副作用就越小,但付出的代价也就越大,因为事务隔离本质上就是使事务在一定程度上串行化,需要根据具体的业务需求来决定使用哪种隔离级别。
二、SQL标准中的隔离级别
事务隔离级别 | 描述 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
未提交读 read uncommitted | 一个事务可以读取到其他事务未提交的数据 | √ | √ | √ |
已提交读 read committed | 一个事务只能读取到其他事务已提交的数据 | √ | √ | |
可重复读 repeatable read | 一个事务多次读取同样的数据结果是一样的 | √ | ||
可序列化 serializable | 所有的事务都是串行执行,不存在事务的并发操作 |
三、Mysql中的隔离级别
不同的数据库厂商对SQL标准中规定的四种隔离级别支持不一样。
1、支持的隔离级别
MySQL虽然支持4种隔离级别,但与SQL标准中所规定的各级隔离级别允许发生的问题却有些出入,MySQL在REPEATABLE READ隔离级别下,是可以禁止幻读问题的发生的。
事务隔离级别 | 描述 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
未提交读 read uncommitted | 一个事务可以读取到其他事务未提交的数据 | √ | √ | √ |
已提交读 read committed | 一个事务只能读取到其他事务已提交的数据 | √ | √ | |
可重复读 repeatable read | 一个事务多次读取同样的数据结果是一样的 | |||
可序列化 serializable | 所有的事务都是串行执行,不存在事务的并发操作 |
2、查看默认的隔离级别【innodb存储引擎】
默认:REPEATABLE-READ
-- 以下3种写法都可以
show VARIABLES like 'tx_isolation';
SELECT @@tx_isolation;
SELECT @@transaction_isolation; -- MySQL 5.7.20的版本以后支持,用来替换tx_isolation
Q:innodb为什么使用RR作为默认的事务隔离级别?
A:因为innodb在RR的级别就解决了幻读的问题。
3、设置指定的隔离级别【innodb存储引擎】
----------------语法----------------
SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL level;
level可选值有4个:
REPEATABLE READ
READ COMMITTED
READ UNCOMMITTED
SERIALIZABLE
GLOBAL关键字:在全局范围内影响,对当前已存在的会话无效,对之后产生的会话有效
SESSION关键字:在会话范围内影响,对当前会话中正在执行的事务无效,对当前会话之后产生的事务有效
两个关键字都不用:只对当前会话中的下一个事务有效,下一个事务执行完后,之后产生的事务恢复到之前的隔离级别
----------------示例----------------
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
四、Oracle中的隔离级别
不同的数据库厂商对SQL标准中规定的四种隔离级别支持不一样,比方说Oracle就只支持READ COMMITTED和SERIALIZABLE隔离级别。
1、支持的隔离级别
事务隔离级别 | 描述 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
已提交读 read committed | 一个事务只能读取到其他事务已提交的数据 | √ | √ | |
可重复读 repeatable read | 一个事务多次读取同样的数据结果是一样的 | √ |
2、查看默认的隔离级别
默认:read-committed