MySQL事务隔离级别

隔离级别

读取未提交(READ-UNCOMMITTED)

最低的隔离级别,允许读取尚未提交的数据变更,可能造成脏读、不可重复读、幻读。

读取已提交(READ-COMMITTED)

允许读取并发事务已经提交的数据,可以避免脏读,但是可能造成不可重复、幻读。

可重复读(REPEATABLE-READ)

对同一字段多次读取的结果都是一致的,除非本身事务修改,可以避免脏读和不可重复读,但是可能造成幻读。(MySQL InnoDB存储引擎默认的事务隔离级别是可重复读)

可串行化(SERIALIZABLE)

最高的隔离级别,完全服从ACID的隔离级别,读写操作都会加锁,多个事务要访问同一条记录时,要进行排队,优先级低的事务必须等优先级高的事务完成以后才能进行。所有的事务依次执行,可以避免脏读、不可重复读、幻读。

事务隔离级别可能引发的问题

脏读

脏读就是读取到未提交的数据, 比如如下代码

#先设置事务隔离级别为读取未提交,然后开启事务
start transaction;
#A事务进行金额交易
update account set money = money - 1000 where id = 1;
update account set money = money + 1000 where id = 2;
#B事务查询账户表就会出现脏读(查询到其他事务未提交的数据)
#A事务执行回滚,数据就会还原了.

不可重复读

#先设置事务隔离级别为读取已提交,然后开启事务
start transaction;
#B事务查询id = 1 数据的金额
select * from account where id = 1;
#A事务进行金额交易
update account set money = money - 1000 where id = 1;
update account set money = money + 1000 where id = 2;
#A事务提交
#B事务还未进行提交事务又进行查询id = 1发现数据变化
select * from account where id = 1;
#在一次事务中多次查询数据不一致则是不可重复读问题

幻读

一般出现在删除和新增情况

#先设置事务隔离级别为可重复读,然后开启事务
start transaction;
#比如说用户表有两条数据,有一个是否完整的字段, 根据name和address判断, 如果都有则赋值完整
#A事务查询有数据符合赋值完整的数据,还未进行事务提交
#B事务有插入一条符合赋值完整的数据,在A事务提交之前提交了.
#A事务提交之后发现又有一条可以赋值的数据,此现象就称为幻读

隔离级别总结

从上到下,隔离级别依次变高,但是性能也依次变差。隔离级别对应出现的问题

隔离级别 是否出现脏读 是否出现不可重复读 是否出现幻读
读取未提交
读取已提交
可重复读
可串行化

事务隔离级别设置语句

查询数据库隔离级别

SELECT @@TX_ISOLATION;

修改数据库隔离级别

SET GLOBAL TRANSACTION ISOLATION LEVEL 级别字符串;

你可能感兴趣的:(mysql,mysql,数据库)