https://www.yduba.com/biancheng-5761553698.html
上节我们学习了Repeatable Read可重复读,在这种隔别级别下,可能会出现幻读 (Phantom Read),但是InnoDB存储引擎通过MVCC解决了快照读数据情况下的幻读问题。当前读的场景是通过记录锁(行锁和)间隙锁 解决的幻读问题。
Serializable [ˈsɪˌriəˌlaɪzəbl] (可串行化),这是最高的隔离级别;此隔离模式无需手动加锁
在每个读的数据行上自动加读锁(共享锁)解决幻读的情况。在这个级别,可能导致大量的超时现象和锁争用的情况。实际很少使用这个隔离级别,除非需要确保数据一致性而且没有并发的情况下,才考虑使用。
现在我们来举个例子说明一下Serializable(可串行化)会出现的问题:
首页在客户端A我们把自动提交事务关闭,然后把隔离级别设置成 Repeatable,并开启了一个事务,如下图:
set autocommit = 0;
set session TRANSACTION ISOLATION LEVEL Repeatable read;
select @@tx_isolation;
这时,如果有客户端B也把自动提交事务关闭,然后把隔离级别设置成Repeatable。
此时,插入一条新纪录,是等待状态,因为A客户端将所有的记录都加锁了,需要释放锁之后B客户端才能插入成功。
等待50秒之后,会报错:Lock wait timeout exceeded; try restarting transaction超过锁定等待超时;试着重新启动事务
继续插入新记录,依旧是等待中,然后超时
通过上面测试我们知道,serializable完全锁定字段,若一个事务来查询同一份数据就必须等待,直到前一个事务完成并解除锁定为止 。是完整的隔离级别,会锁定对应的数据表格,因而会有效率的问题。