mysql四种事务隔离级别(整理)
Read Uncommitted(读取未提交内容)
解读:事务B可以 读取 事务A 未提交内容。
结果:导致脏读
举例:
事务A开启事务:
set SESSION TRANSACTION ISOLATION LEVEL read UNCOMMITTED;
start TRANSACTION;
事务B开启事务:
set SESSION TRANSACTION ISOLATION LEVEL read UNCOMMITTED;
start TRANSACTION;
事务A修改一条银行账户余额:
update account set balance = balance -50 where id = 1;
事务B读取此人账户余额:此时是850
select * from account;
事务A回滚账户余额:
ROLLBACK;
此时是900
Read Committed(读取提交内容)
解读:事务B 只能读取 事务A 提交内容 (大部分数据库默认隔离级别,非MySQL默认级别)
结果: 解决脏读, 导致不可重复读(non-repeatable read)
解释(不可重复读): 一个事务的两次查询之中数据不一致,
事务B第一次查询数据和第二次查询数据不一致。
举例:
事务A开启事务:
set SESSION TRANSACTION ISOLATION LEVEL read committed;
start TRANSACTION;
事务B开启事务:
set SESSION TRANSACTION ISOLATION LEVEL read committed;
start TRANSACTION;
事务A更新银行余额:
update account set balance = balance -50 where id = 1;
事务B查询银行余额:(此处没有脏读)
select * from account;
事务A提交更新结果:
commit;
事务B查询银行余额不一致:
select * from account;
第一次是900,第二次是850,如果按照第一次的900来增加余额,那么900+50=950,其实准确用户此时有850+50=900。
Repeatable Read(可重复读)
解读: 同一事务的多个实例在并发读取数据时,会看到同样的数据行。(MySQL默认隔离级别)
结果: 解决脏读,不可重复读,导致幻读(Phantom Read)。
解释(幻读): 一个事务的两次查询数据笔数不一致。与不可重复读不同点在于,新增或者删除引起的行数变化。
举例:
事务A开启事务:
set SESSION TRANSACTION ISOLATION LEVEL repeatable read;
start TRANSACTION;
事务B开启事务:
set SESSION TRANSACTION ISOLATION LEVEL repeatable read;
start TRANSACTION;
事务A更新银行余额:
update account set balance = balance -50 where id = 1;
事务B查询:(查询到事务A更新前的数据)解决脏读
select * from account;
事务A提交数据:
commit;
事务B查询数据:(查询到事务A更新前的数据)解决不可重复读
select * from account;
幻读开始
事务A和事务B开启新事务:
sessionA: start TRANSACTION;
sessionB: start TRANSACTION;
事务A插入新数据:
insert into account value(4,'aa',123);
commit;
事务B查询数据:(查询不到事务A提交的数据):
select * from account;
如果事务B插入相同ID的数据:(这就是幻读,没有却有此数据幻影)
insert into account value(4,'aa',123);
Serializable(可串行化)
解读: 最高隔离级别,强制事务排序,使之不可能相互冲突。
即 在每个读的数据行上加上共享锁。
结果:解决脏读,不可重复读,幻读
可能导致大量的超时现象和锁竞争