数据库隔离性
Mysql有四种隔离级别:read uncommitted(读取未提交内容),read committed(读取提交内容),repeatable read(可重复读),Serializable(可串行化)
脏读:读取了并没有提交事务的数据;不可重复读:每次读取的数据都是最新的,本是一种正常的现象但是有时会因为两次读取的数据不一致导致异常
幻读:主要针对批量的数据,两次读取数据(行数或者某行的数据)不一致;
其中,mysql默认repeatable read
现在进行测试进行加深理解
打开两个命令端的mysql,分别命名为A,B
将A设置为read uncommitted,注意此时B并不会更改,依然是repeatable read
A:开启事务,并查询user表
B:向user表插入一条数据
A:再次查询user表,这时候B并没有提交事务,A却能查询出id为6的数据,这就是脏读。
B:进行事务回滚
A:再次查询user表
===============================read committed=======================
将A设置为read committed
B:对id为8的数据进行更新
这个时候B并没有提价事务,A发送查询语句,并没有查询最新数据
B:提交事务;
A:发送查询语句,能读取最新数据,这就是不可重复读。
=================repeatable read===============================
刚发现一个有意思的问题
B:start transaction;update user set loginname='rr' where id=8;select * from user;/*能查询出最新数据*/
A:start transaction;select * from user;/*这时候A能查询出最新数据,因为是第一次查询所以A能查询出最新数据*/
现在再来一次B的update语句
B:update user set loginname='ii' where id=8;
A:select * from user;/*这时候A查询的数据就是loginname='rr'的数据,因为这个是从缓存里面查询出来的*/
B:commit;
A:select * from user;/*现在A也不能查询出来最新数据,这就是可重复读*/
B:insert into user(loginname) values('Ian');commit;
A:select * from user;/*查询出来依然只有两条,这就是幻读(批量数据不一致)*/
===================Serializable==========
A:set session transaction isolation level serializable;这个时候user表已经锁定
这个时候B发送插入语句,但是在等待状态/*并没有显示Query OK*/,等A提交事务了,B就会马上执行插入语句,A:再次发送查询语句,是最新的数据