事务隔离级别
事务隔离级别有四种:read-uncomitted,read-commited,repeatable-read,serializable;
read-uncomitted:未提交读,即可以读取另一个事务已经更新但尚未提交的数据,会出现幻读,脏读,不可重复读等各种状况;
read-commited:提交读,指只能读取另一个事务已经更新且已经提交的数据,可以避免脏读,但是可能会出现不可重复读等情况;
repeatable-read:可重复读,即可以重复读取数据,开启事务后,同一查询条件不会产生不一样的结果,不会出现不可重复读,脏读等情况,但是可能出现幻读,mysql默认为可重复读;
serializable:串行读,即读写都是串行的,读写都会加上表级锁,不会出现脏读,幻读,不可重复读;
>幻读:指的是读取的数据是不正确的数据,事务1读取数据行1的到字段a值为aa,但是可能存在另一个事务对该数据行进行更新操作,修改该值为bb,那么事务1读取到的数据就是不正确的,这就是幻读;
脏读: 指的是读取到别人未提交的数据
示例
查询开始前,设置事务隔离级别为read-uncommitted,set @@session.tx_isolation='read-uncommitted';
如下所示:
开启事务,更新数据,未提交
图1,事务更新数据开启另一个connection,设置隔离级别为read-uncommited,可以读取到未提交的数据,出现脏读
图二,未提交读开启另一个connection,设置隔离级别为read-committed,只能读取提交数据,不会出现脏读,但是不能避免不可重复读,因为如果多个connection都修改了数据,每次读取数据都会不一样
图三 读未提交读提交数据
图4,提交数据 图五 读提交可重复读
开启一个connection,设置隔离级别为repeatable-read,查询前,开启事务,那么在事务提交之前,无论其他事务修改了多少次数据读取都是一样的
图六 第一次读图七 更新一次
图8 未提交第二次读
图9 ,提交第二次读
从上可以看出,可重复读,再开启事务后,查询数据永远是开启事务前的数据,避免了脏读,和不可重复读
但是无法避免幻读
幻读是指一个事务读取到了不正确的数据,进行修改时发现数据已经不是原来的数据,从而导致失败,多发生于另一个事务修改了该数据;
可以使用串行来解决
serializable
一个connection设置隔离级别为serializable,同时查询该数据,另一个connection修改该行数据
图十 串行读图十一 修改数据
网友评论