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 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查询:(查询到事务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);

IMG_256

Serializable(可串行化)

解读: 最高隔离级别,强制事务排序,使之不可能相互冲突。

即 在每个读的数据行上加上共享锁。

结果:解决脏读,不可重复读,幻读

可能导致大量的超时现象和锁竞争

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章