悲观事务加锁验证
作者: h5n1 原文来源:https://tidb.net/blog/2e50f49d
【是否原创】是
【首发渠道】TiDB 社区
【正文】

TiDB 在 3.0.8 版本前使用乐观事务模式,乐观事务模式下数据写入时首先在 tidb server 侧缓存,然后在用户提交时 prewrite 阶段进行冲突检测和写入数据,commit 阶段写入版本信息、清除锁信息。悲观事务模型下在 DML 阶段就会写入悲观锁,从事务模型可以看到 tidb 内锁的实现是靠 tikv 的 LOCK CF 内写入锁相关数据实现,tidb server 属于无状态服务,相互之间并无关联也无法在多个 tidb 间进行锁冲突检测,因此只有将锁信息写到 tikv 才能实现全局的冲突检测。
基于上述信息可以推断:在使用乐观事务模式时未提交前无法看到锁事务信息。悲观模式下 DML 阶段就会上锁将锁信息写入到 tikv,因此在提交前可以看到锁相关信息。
本文使用 MVCC 的 API 接口查看提交前和提交后的 MVCC 信息以验证上述推断的正确性,该 API 接口访问 tikv 端口。
1、 创建一张验证表并插入 2 条数据验证 MVCC 信息

第 1 条数据 MVCC 信息,writes 里包含 short_value,当行数据小于 256 字节时会将数据存储于 WriteCF 而不放到 Default CF。

第 2 条记录中包含 values 项,将字段值放到 Default CF. 下面过程中将对此验证

2、 插入新数据且不提交,检查 MVCC 信息

此时可以看到 lock 信息和 primary 信息

3、 提交插入操作后再次查看
可以看到提交后 LOCK 信息消失,writes 里写入了相关数据

对 short_value 进行验证:

4、 在乐观模式下查看未提交时锁信息

当会话修改为乐观模式后,MVCC 内没有锁相关数据

5、 提交乐观模式事务。
提交之后可以看到 MVCC 信息。

对 value 进行验证

从上面验证过程可以看出悲观事务模式下 DML 时会写锁信息,相关锁信息会写入到 tikv 进行持久化,当数据值小于 256 字节会将数据写入到 WriteCF。理论上悲观模式要比乐观模式产生更多的 raft 消息。
参考文档
TiKV 的 MVCC 机制:https://pingcap.com/zh/blog/mvcc-in-tikv
API 描述: https://github.com/pingcap/tidb/blob/master/docs/tidb_http_api.md
TiDB 悲观锁实现原理 :TiDB 悲观锁实现原理
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/d3ade5a88a1487fc0bb2c3c67】。文章转载请联系作者。
评论