关于MySQL可重复读的问题
一、可重复读
我们先看看现象,再分析原理。我的mysql版本是10.3.13。
下面是一张表,只有一条数据,并且我开启了事物
事务一:
事务二:
此时,事务二, 将sc + 1 执行下面的命令:
成功加1之后,实际上,数据库中sc肯定是2。
然后回到之前的客户端,再查一次:
查看事务一:
没毛病,sc还是1,果然是可重复读。有些人以为mysql的可重复读是通过行锁实现的,
从上面可以知道,肯定不是,如果是的话,第一次select * from demo的时候,id=1的记录就会加行锁,我都加行锁了,我还没提交,另外的事物是怎么update成功的。
结论就是mysql使用的MVCC(多版本并发控制),MVCC详解可以看:https://blog.****.net/whoamiyang/article/details/51901888
我们继续,我之前的第一个事物还没提交,不过提交之前,我也想加1;
对事务一的数据进行+1:
加完之后可以看到,锁等待超时。也就是说(事物二)在更新完后,会加行锁,这个应该比较好理解。事物中,刚开始查询的时候是不会加行锁的,但是当有更新操作之后,会加行锁,直到事物提交。
事务二提交:
此时事务一对数据重新进行更改:
事务一对数据更改成功:
注意:
再 可重复读的情况下 。当一个事务对数据库中的数据进行修改时,就对该条数据添加了 行锁。那么其他事务就不能对该条数据进行修改。
但是: 只是添加了 行锁.并不影响其他事务对其他数据的修改。
事务一:
数据库中有两条数据:
事务二:
更改事务一中的第一条数据:
可以看到已经更改成功了。
更改事务二中的第二条数据:
可以看到也更改成功了
将事务二的更改数据提交:
查询一下事务一的数据:
事务一的数据并没有变化
重新开启一个终端查看数据库:
数据库中的数据已经发生了变化…
http://hedengcheng.com/?p=771,http://hedengcheng.com/?p=844 这两篇博文详细的介绍了mysql中的这些问题,有兴趣可以读一读。