并发事务问题
read uncommitted,存在脏读、不可重复度、幻读
read committed,存在不可重复读、幻读
repeatable read(默认),存在幻读
serializable(串行化,序列化),都不存在
前提:准备一个表
-- 账务信息
create table account(
name varchar(10),
money double
);
1. 脏读
一个事务读到另一个事务还没提交的数据。
1. 两个均设置为读未提交(Read uncommitted)隔离级别:
2. 事务b读取到事务a还没提交的数据,属于脏读
2. 不可重复读
一个事务先后读取同一条记录,但两次读取的数据不同
1. 设置事务隔离级别为读已提交(Read committed)
2. 事务b读不到事务a还没提交的数据,避免了脏读。
3. 事务b读取到了事务a提交的数据,出现不可重复读。
3. 可重复读
事务b不能读取事务a提交过的数据,事务之间相互隔离。
1. 设置事务的隔离级别为可重复读(Repeatable read)
2. 开启事务,事务b不能读取事务a提交过的数据,避免了不可重复读。
4. 幻读
一个事务按照条件查询数据时,没有对应的数据行,但是在插入时,又发现这这数据行已经存在,好像出现了幻影。
1.设置事务的隔离级别为串行化(serializable)。
2. 一个事务的执行必须等上个事务结束l,另一个事务才可以操作。避免了两次查询结果不一致
注意:事务隔离级别越高,性能越低。
查看事务隔离级别
select @@transaction_isolation
设置事务隔离级别
select [session|global] transaction isolation {四种,read uncommitted | read committed | repeatable read | serializable }