遇到多用户操作同一个表的业务,心里有一些不解之处
我知道Mysql多事务间的读写是通过MVCC隔离的,这样保证写操作即使有修改,读操作依旧能读到正确版本号的字段值。
但是对于多事务的并发修改操作。我很疑惑,Mysql已经是行级锁的前提下,第一个到达的事务不是会锁住行,这样不是已经实现写写分离嘛,为什么还需要再使用版本号version乐观锁机制,甚至有些人会推荐使用Lock table这种消耗大的方式?
但是对于多事务的并发修改操作。我很疑惑,Mysql已经是行级锁的前提下,第一个到达的事务不是会锁住行,这样不是已经实现写写分离嘛,为什么还需要再使用版本号version乐观锁机制,甚至有些人会推荐使用Lock table这种消耗大的方式?
很多情况下,程序代码去锁数据,不仅仅是为了不让别的会话修改,更多情况下是一种判断,判断这个数据是否正在被别的会话修改,这种操作一般放在一个事务操作的比较靠前的位置,根据加锁是否成功这个步骤,来决定是否需要继续向下执行正常逻辑还是去执行异常逻辑或者等待。
举例,有时候更新数据,会根据数据当前的值来计算,即先查询再修改,如果它查询的数据其他会话正在修改,等它查完后,其他会话把事务提交了,那么它根据之前数据计算出来的值再更新到这个表就会出现问题,所以它不能先查数据,而是应该先判断有没有人在改数据。
至于lock table,那是因为insert不会锁(除非有唯一键),要防止记录出现重复。
实际应用中,应该根据不同的业务逻辑场景,去选择不同的加锁机制,不能一概而论,这个东西不能只看数据库机制层面,还应该去看业务场景及程序代码控制