MYSQL的四种事物隔离级别

1.Read Uncommitted(读取未提交事务)

   设置AB进程的隔离级别  

这里写图片描述

这里写图片描述

  A进程删除数据(d,100,100,100,100),未提交,但是B进程中查询时,数据行已经被删除。

这里写图片描述

2.Read Committed(读取提交的事物)
这是大多数数据库系统默认的隔离级别,(但不是MYSQL默认的)它满足了隔离的简单定义,即一个事物只能看见已经提交的事物对数据所做出的改变,这种隔离级别也支持所谓的不可重复读。

  重新设置AB的隔离级别

这里写图片描述

 A中添加数据,不提交,B中查询不到

这里写图片描述

  A中提交

这里写图片描述

    B中可以查询到了

这里写图片描述

3.Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

  A进程:设置隔离级别

这里写图片描述

    B进程:设置隔离级别,并插入数据(d,100,100,100,100)但并未提交

这里写图片描述

       A进程进行查询,是查不到

这里写图片描述

   A进程commit再进程查询,还是没有查询到,因为我没有在B中commit

这里写图片描述

   B进程中提交

这里写图片描述

 A中再查询,就可以查询了

这里写图片描述

4.Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

  该类型在A客户端操作test.test1表时会锁定该数据,如果B客户端想要操作test.test1就需要等待A客户端释放。

猜你喜欢

转载自blog.csdn.net/s_yj_q/article/details/80038846