一个请求到底是不是一个事务?视图里出错时哪些写入会留下?事务拖得久会怎样?这篇用真实的 PostgreSQL 与多线程的 gunicorn,把事务边界的每个情形跑一遍。
/two-commits 里两次 commit 后各自的 txid_current(): {'t1': 734, 't2': 735} → 两个不同的事务
/no-commit 只 add 不 commit,库里的行: seed,x-1,x-2上一篇:SQLAlchemy Session 生命周期;下一篇:Model 与 Table 映射。
/commit-then-fail → HTTP 500 | 库里的行: seed,y-a
/atomic → HTTP 500 | 库里有没有 z-a: False
{"after_rollback":true,"first":"IntegrityError","second":"PendingRollbackError"}
已经执行过查询(事务已自动开始)再调 db.session.begin(): {"begin":"InvalidRequestError: A transaction is already begun on this Session."}
begin_nested(保存点)里违反唯一约束:只回滚保存点,外层的 sp-keep 仍被提交: TrueB 更新同一行:等了 1382 ms(A 总共 1684 ms) 有请求在做只读查询后睡 1.5 秒(没 commit,连接 idle in transaction):B 更新只用了 2 ms
并发用的是 gunicorn 的 gthread worker,B 请求在 A 之后 0.3 秒发出。
/auto-ok → HTTP 200 | 是否留下 auto-ok: True /auto-400 → HTTP 400 | 是否留下 auto-400: False /auto-500 → HTTP 500 | 是否留下 auto-500: False