用途:指导用户在 CockroachDB 中基准测试、解释并比较同一事务业务流的两种写法——显式多语句事务(BEGIN/COMMIT)与单语句 CTE 事务,重点关注争用下的性能、公平测试方法与结果解读。
主要能力:说明两种模型差异。显式模型跨多次往返保持事务打开,扩大争用窗口;CTE 模型将逻辑折叠为单条原子语句,缩短事务时长并减少重试。因 CockroachDB 默认拒绝单语句多次修改同一表(sql.multiple_modifications_of_table.enabled),CTE 写法用 CASE 将借记与贷记合并为一次 UPDATE。
使用方式:准备独立测试库与表(accounts、transfers),用多行 UPSERT 播种数据;用 pgbench 以相同并发、时长和参数分别运行显式与 CTE 脚本,例如 pgbench -n -c 64 -j 8 -T 120 -f explicit_transfer.sql "postgresql://root@localhost:26257/bankbench?sslmode=disable";两次运行之间重置余额以保证公平;对比吞吐量、重试总数、p50/p95/p99、最大延迟与失败数;用 COUNT 校验转账量,用 cockroach node status 检查节点存活。
适用场景:争用较重、操作天然原子、应用当前跨多语句执行读-决定-写,且目标是更高吞吐、更少重试与更稳定尾延迟时,倾向 CTE;工作流无法用单条 SQL 清晰表达、可读性或分阶段业务逻辑更重要、争用较低时,倾向显式模式。
限制与注意:CTE 减少但不消除争用;基准须在专用测试集群运行,勿用于生产;运行间重置数据,否则只能算演示而非公平对比;需验证结果可迁移到实际工作负载后再改生产。资料给出一次高争用参考结果:吞吐 591.1 对 1,035.1 txn/s,墙钟 216.5s 对 123.7s,平均延迟 202.2ms 对 111.3ms,重试 2,270,977 对 0。具体环境差异与更多细节暂未提供。