MySql事务隔离级别:读未提交(Read uncommitted)、读已提交(Read committed)、可重复读(Repeatable read)、可串行化(Serializable )

一、MySql事务隔离级别

隔离级别 脏读 不可重复读 幻读
读未提交(Read uncommitted) 可能 可能 可能
读已提交(Read committed) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 可能
可串行化(Serializable ) 不可能 不可能 不可能

二、事务隔离级别的描述

1、读未提交(Read uncommitted)

      在一个事务a执行过程中可以读取到其它事务中编辑后的数据,尽管其它事务还没有提交。

      当事务a中读取到了事务b编辑后的数据后,事务b做了回滚操作。那么事务a读取到的数据就是脏数据(脏读)

      当事务a在执行过程中对同一条查询语句执行了多次,但由于事务b在事务a多次查询过程中新增(insert)了数据,造成事务a多次查询的结果不一致,那么事务a的多次查询结果不一致的情况就是幻读;

      当事务a在执行过程中对同一条查询语句执行了多次,但由于事务b在事务a多次查询过程中修改(update)或者删除(delete)了数据,造成事务a多次查询的结果不一致,那么事务a的多次查询结果不一致的情况就是不可重复读;

2、读已提交(Read committed)

在一个事务a执行过程中可以读取到其它事务编辑并提交(commit)后的数据,如果其它事务没有提交,则获取不到。

当事务a在执行过程中对同一条查询语句执行了多次,但由于事务b在事务a多次查询过程中修改(update)或者删除(delete)了数据,造成事务a多次查询的结果不一致,那么事务a的多次查询结果不一致的情况就是不可重复读;

在将MySql的事务隔离级别改为读已提交(Read committed)的时候,需要修改my.cnf配置文件,将二进制日志(bin log)存储格式改成ROW。并且隔离锁将失效。

3、可重复读(Repeatable read)

是MySql的默认事务隔离级别,在一个事务a执行过程中对同一条查询sql语句执行结果都是一样的,不受其它事务的影响。

当事务a在执行过程中对同一条查询语句执行了多次,但由于事务b在事务a多次查询过程中新增(insert)了数据,造成事务a多次查询的结果不一致,那么事务a的多次查询结果不一致的情况就是幻读;

where 范围操作的时候会产生隔离锁。 例如:update student set name = '小王' where id > 5 and id < 10;

隔离锁锁住的是id小于5的哪条数据 至  id大于10之间的数据。例如id在表中的值有(1,2,20,30),那么上面的sql语句锁住的范围未2 - 20之间。对于insert的隔离锁没有这种限制。

可使用(排他锁)for update或者共享锁(lock in share mode)来避免幻读:select * from table where id = 1  for update ;   或者select * from table where id = 1  lock in share mode;

4、可串行化(Serializable )

于可重复度(Repeatable read)比较接近,当autocommit被禁用后,innodb存储引擎会将每个select语句后面都加上 lock in share mode(共享锁);

你可能感兴趣的:(MySql,Mysql,事务,事务隔离)