MySql的事务隔离级别
事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read Uncommitted | 是 | 是 | 是 |
Read committed | 否 | 是 | 是 |
Repeatable Read(默认) | 否 | 否 | 是 |
Serializable【串行化级别最高】 | 否 | 否 | 否 |
级别从上往下隔离级别越来越高,性能越来越差。
命令
- select @@transaction; 【查看事务隔离级别】
- set [session | global] transaction isolation level {Read Uncommitted | Read committed | Repeatable Read | Serializable} 【设置事务隔离级别】
脏读、不可重复读、幻读的演示
- 脏读
可以发现有两个事务正在同时操作数据库,但是两个事务存在干扰,事务一读到了事务二操作后的数据,即张三的金额减了1000,在隔离级别为Read Uncommitted 下。
- 不可重复读
在Read committed 的隔离级别下可以解决脏读,当依然存在不可重复读,即在一个事务里两个相同的查询语句查询出来的数据不一样,即在同一个事务中两次查询查询到了其他已经提交的事务对该数据的修改,从而导致查询结果不一样。
- 幻读
在Repeatable Read 的隔离级别下可以解决脏读、可重复读,但依然存在幻读,即在一个事务中首先查询时数据不存在,在事务二中插入该数据,而在事务一查询数据为空后,插入该数据显示插入失败,因为在事务二中已经插入,但在事务一查询还是为空且依然插入失败,这就是幻读现象。
- 串行化隔离级别
串行化隔离级别可以解决脏读、不可重复读、幻读等全部问题,即所有的事务的串行执行,在上一个事务结束后才能执行下一个事务,串行执行。
qiumin