用途:指导 PostgreSQL 事务隔离级别的选择,以及处理 SQLSTATE 40001 serialization_failure,防止把 40001 当作硬错误。
主要能力:说明 READ COMMITTED(默认,语句级快照)、REPEATABLE READ(事务级快照)、SERIALIZABLE(SSI,可防写偏斜)三级别各自能防与仍允许的现象(脏读、不可重复读、幻读、写偏斜);解释 40001 的两类消息(concurrent update、read/write dependencies among transactions)均为可重试的中止,而非 bug;说明 SSI 用谓词锁(pg_locks 中的 SIReadLock)检测危险读写依赖环,只触发 40001,不阻塞、不死锁,可能误报。
使用方式:在 REPEATABLE READ/SERIALIZABLE 事务外层加整事务重试循环,捕获 40001(及 40P01)后回滚,从 BEGIN 重跑全部读写,指数退避加抖动并设重试上限(如 5 次);隔离级别用 BEGIN ISOLATION LEVEL ... 或 SET TRANSACTION 设置(须为首条命令);会话/库级可用 SET SESSION CHARACTERISTICS 或 ALTER DATABASE ... SET default_transaction_isolation;长只读报表可用 BEGIN ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE 避免 40001。
适用场景与限制:适用于检查后行动的不变量(余额上限、重复预订、容量计数)、多语句一致性报表;不适用于 40P01 死锁、23xxx 约束冲突(不可重试)、普通行锁等待。区分 40P01 与 40001;重试整个事务而非单条语句。其余实现细节暂无提供。