MySQL 事务的隔离级别
MySQL 事务的隔离级别
文章目录
- MySQL 事务的隔离级别
- 1. 并发事务问题
- 2. 事务的隔离级别
1. 并发事务问题
当存在多个事务对同一个数据库进行并发数据操作时,可能会出现下述几个问题:
- 脏读:一个事务读取到了另一个事务还未提交的数据;
- 不可重复读:一个事务中先后读取同一条记录,但两次读取操作读取到的数据并不一致(中间可能有另一个事务对这条记录进行了数据修改);
- 幻读:一个事务先执行了读取操作,在发现记录不存在后准备将这条数据插入数据库时,另一个事务横插一脚将数据插入了,这个时候第一个事务再进行插入操作时就会发现数据已经存在了,无法插入,这和刚刚读取到结果不一致,就是幻读;
那有没有什么方法来解决这些并发事务问题呢?这里引入隔离机制!
2. 事务的隔离级别
通过事务的隔离机制就可以解决上述的并发事务问题,事务的隔离级别如下:
Read uncommitted
:读未提交,这种隔离级别会导致当前事务读取到其它事务未提交的数据,也就是脏读;Read committed
:读已提交,这种隔离级别能使事务只会读取到其它事务提交后的数据,能够防止脏读,但无法解决不可重复读和幻读;Repeatable Read
:可重复读(MySQL 默认机制),能够使当前事务中的前后读取操作读取到的数据一致,以此解决不可重复读问题,但无法解决幻读;Serializable
:串行化,在当前事务未结束之前另一个事务对数据进行修改操作并提交事务时会进入阻塞,直到当前事务提交后才能解除阻塞状态,以此来解决幻读问题,同时也能解决脏读和不可重复读问题,但性能也是明显下降;
可见不同的隔离级别能够解决的并发事务问题不同:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted | ✕ | ✕ | ✕ |
Read committed | ✓ | ✕ | ✕ |
Repeatable Read(默认) | ✓ | ✓ | ✕ |
Serializable | ✓ | ✓ | ✓ |
操作隔离级别的常用命令:
-
查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
-
设置事务的隔离级别
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITED | Read COMMITED | REPEATABLE READ | SERIALIXABLE};
-- 设置当前会话中隔离权限为 读未提交 set session transaction isolation level read uncommited; -- 设置当前会话中隔离权限为 读已提交 set session transaction isolation level read commited; -- 设置当前会话中隔离权限 可重复读 set session transaction isolation level repeatable read; -- 设置当前会话中隔离权限 串行化 set session transaction isolation level serializable;
注:随着事务的隔离级别上升,数据的安全性得到提高,但性能也会随之下降,在确定事务隔离级别时需要我们根据需求场景合理调整!
以上便是对事务隔离级别的介绍了,如果上述内容对大家有帮助的话请给一个三连关注吧💕( •̀ ω •́ )✧✨