写点什么

悲观事务加锁验证

  • 2022 年 7 月 11 日
  • 本文字数:945 字

    阅读完需:约 3 分钟

作者: h5n1 原文来源:https://tidb.net/blog/2e50f49d


【是否原创】是


【首发渠道】TiDB 社区


【正文】


                              **悲观事务加锁验证**
TiDB采用percolator 事务模型,使用default CF 存储数据,LOCK CF 存储锁信息,Write CF存储提交版本信息。上述CF的数据存储格式为:
复制代码



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 悲观锁实现原理


发布于: 刚刚阅读数: 2
用户头像

TiDB 社区官网:https://tidb.net/ 2021.12.15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
悲观事务加锁验证_管理与运维_TiDB 社区干货传送门_InfoQ写作社区