首页/数据/SQL 速查/SERIALIZABLE 的两种实现:SSI 与锁
变更与事务52 条

SERIALIZABLE 的两种实现:SSI 与锁

同为 SERIALIZABLE:PostgreSQL 用 SSI(乐观检测、冲突中止),MySQL InnoDB 把普通读升级为共享锁(悲观、等待增多)。

SQL 速查数据更新于 2026-10-12

PostgreSQL SSI

PostgreSQL SSI
BEGIN ISOLATION LEVEL SERIALIZABLE;
SELECT sum(balance) FROM accounts WHERE user_id = 1;
-- 并发冲突时:ERROR 40001 could not serialize access
COMMIT;   -- 失败后应用重试整个事务
PostgreSQLSSI 不阻塞、检测到危险结构时中止事务(40001)
MySQLSERIALIZABLE 下普通 SELECT 隐式加共享锁,阻塞与死锁概率上升
应用要求无论哪种,都要实现“捕获错误-回滚-重试”的完整链路

易错点

  • SSI 依赖重试:没有重试机制的应用在 SERIALIZABLE 下高峰期报错率会明显上升
  • MySQL SERIALIZABLE 与 PG 行为差异大(锁 vs 检测),跨库压测结论不能互相套用

数据来源与参考

  • PostgreSQL Documentation · Serializable Isolation Level
  • MySQL 8.0 Reference Manual · Transaction Isolation Levels
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌