用途:指导开发者在 CockroachDB 上设计正确、高性能、可恢复的事务模式,覆盖从事务边界、重试逻辑到连接池与可观测性的完整实践。
主要能力:区分隐式与显式事务;实现带指数退避的客户端重试;在乐观与悲观并发控制间选择;用原子 SQL 替代读改写循环;配置连接池(HikariCP、pgbouncer 等);用 keyset 分页替代 OFFSET/LIMIT;对报表分析使用 follower reads;将业务编排与数据库事务分离;使用预处理语句;显式列投影替代 SELECT *;在并发下测试应用行为并监控数据库性能。
必要用法:单条语句用隐式事务,不要包 BEGIN/COMMIT;多条语句需原子成功时用显式事务并处理重试,CockroachDB 默认 SERIALIZABLE,40001 需整体重试,40003 不可盲目重放非幂等操作,23xxx 通常不重试;只读事务可标记 SET TRANSACTION READ ONLY;用 UPDATE ... SET col = col + 1、UPSERT、INSERT ... ON CONFLICT、CTE 保持原子性;热点行可选择性使用 SELECT ... FOR UPDATE;用集合操作、批量 INSERT/UNNEST、JDBC addBatch 替代逐行循环;非关键查询用 AS OF SYSTEM TIME 做 follower read;分页用 WHERE id > 5000 ORDER BY id LIMIT 100;用预处理语句防注入并复用计划;键与索引应分散负载,避免顺序主键热点;连接池参考 HikariCP 参数;事务内只做读写与约束,外部调用放事务外;单事务负载约 16MB 上限,建议单行小于 1MB、总负载小于 4MB、语句少于 10 条,大对象存对象存储。
适用场景:订单、账户转账、库存、限额等需要原子状态变更与并发控制的业务;仪表盘、分析、ETL 等可接受轻微延迟的读取。
限制:需熟悉 SERIALIZABLE 与 ACID;需应用源码与可连接的 CockroachDB 集群用于测试;keyset 分页不适合任意跳页;悲观锁过度使用可能引入等待链或死锁;普通 savepoint 不能作为重试机制,仅支持 cockroach_restart 协议,多数应用建议整体重试。SQL 语法、模式设计与查询优化参见 cockroachdb-sql,事务模式基准测试参见 benchmarking-transaction-patterns。