rollback 之后 session 里的对象是什么状态?哪些东西回滚不了?commit 失败之后为什么还要手动 rollback?这篇用真实的 PostgreSQL 把每一种情况跑一遍。
a(改了 bal) persistent → persistent (expired) new(已 flush 的新对象) persistent → transient d(已 delete + flush) deleted → persistent (expired) rollback 之后访问 a.bal = 100 (重新发了 1 条 SELECT;内存里改成 999 的值丢了) d 回到数据库里: True
上一篇:Session Flush 与 Commit;下一篇:数据库连接池。
回滚掉的 INSERT 用过 id=4;下一次成功插入的 id=5(中间有空洞)
outer 在库里: True | inner 在库里: False
第一次 commit → IntegrityError / UniqueViolation 没 rollback 就继续 commit → PendingRollbackError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a rollback() 时的警告: SAWarning: Session's state has been changed on a non-active transaction - this state will be discarded. rollback 之后重新来 → 成功,库里有 after_fail: True
违反唯一约束: UniqueViolation 接着执行 select 1 → InFailedSqlTransaction : current transaction is aborted, commands ignored until end of transaction block rollback 之后 select 1 → 1
commit 后再 rollback,库里的 committed: 1
视图 flush 后抛异常(HTTP 500),库里的 viewlost: 0 同时 PG 里是否留下 idle in transaction 的连接: 0