您的位置:首页 > 数据库 > MySQL

MySQL InnoDB :事务隔离隔离级别以及对应的问题

2017-05-16 13:54 686 查看
通过锁机制可以实现事务的隔离性要求,使得事务可以并发地工作。但是锁的使用也会带来几种问题:脏读,不可重复读,幻读, 丢失更新。

ANSI SQL隔离级别

隔离级别脏读不可重读幻读加锁读
READ-UNCOMMITTEDYESYESYESNO
RED-COMMITTEDNOYESYESNO
REPEATABLE-READNONOYESNO
SERIALIZABLENONONOYES
1, 脏读 :事务A会读取另外一个事务B尚未提交的数据(Read-Uncommitted)

违反事务的隔离性(isolation)要求

脏数据:事务对缓冲池中的行记录已经修改,但是还没有被提交(uncommitted)。

这种情况会在tx_isolation=READ-UNCOMMITTED的情况下出现。

只要tx_isolation=READ-COMMITTED,就可以避免脏读。

事务A事务B
begin; 
 begin;
select * from phantom where a=1; (1,1) 
 update phantom set b=100 where a=1;
select * from phantom where a=12;(1,100) 
 commit;
commit; 
2, 不可重复读 : 事务A读取某一行数据 r = r0,  同时另一个事务B修改 r = r1 ,并且提交,导致事务A读取的数据 r 前后不一致。

违反事务的一致性(consistent)要求

这种情况会在tx_isolation=READ-COMMITTED的情况下出现。

只要tx_isolation=REPEATABLE-READ就可以避免

事务A事务B
begin; 
 begin;
select * from phantom where a=1; (1,1) 
 update phantom set b=100 where a=1;
 commit;
select * from phantom where a=12;(1,100) 
commit; 
3,幻读Phantom Read
当事务A读取在某个范围内的记录时,另一个事务B又在该范围内插入了新的数据,当A再次读该范围内的数据时产生了幻行。
这种情况会在tx_isolation=REPEATABLE-READ的时候产生,要避免的话需要设置tx_isolation=Serializable

事务A事务B
begin; 
 begin;
select * from phantom; (1,1) 
 insert into phantom values(1,2);
 commit;
select * from phantom;(1,1)(1,2) 
commit; 
4,丢失更新
两个事务都对某个数据进行更新操作,但是其中一个被覆盖。这种情况会在tx_isolation=REPEATABLE-READ的情况下出现。
这时候需要设置为tx_isolation=Serializable才可以避免
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: