悲观锁在prewrite 后阻塞读咨询

  • 悲观锁不包含数据,只有锁,只用于防止其他事务修改相同的 key,不会阻塞读,但 Prewrite 后会阻塞读(和 Percolator 相同)。 请问为啥悲观锁在prewrite 后会阻塞读?那这样性能影响很大了吧?
1 个赞

有因果关系,如果T1 的事务在提交之前,T2 事务在读
那么不阻塞,T2 会读到旧版的数据,如果阻塞了,T2 会读到最新的数据,这个时候 T1 提交的值,会直接影响到T2 事务执行的结果了… 大概是这个意思

如果你觉得悲观锁对性能有影响,可以用乐观锁的,只要场景合适

我觉得读应该不会阻塞,为啥会阻塞,原理是啥?

MVCC的方式,不会阻塞的,写可能会

悲观锁 pessimistic lock 和 prewrite lock 性质有所不同,pessimistic lock 的加锁是在语句执行过程中,也即事务状态处于“执行中”,也意味着此时事务还没进入提交阶段。事务提交数据的最终版本在提交阶段才能确定,所以遇到pessimistic lock 的读请求不会被阻塞,直接返回老版本数据即可。prewrite lock 加锁发生在提交阶段,此时最终提交版本对于读事务而言可能是可见版本,所以需要等待事务状态确定,读事务才能推进。
针对读写和写写冲突有不同的处理和优化机制,以达到减少冲突对于性能造成的影响。

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。