db.Transaction未提交因未显式调用tx.Commit()且无自动提交机制defer tx.Rollback()仅兜底panicAfterCommit钩子须在事务内注册且绑定原实例嵌套事务实为savepoint需统一API操作HTTP等I/O严禁入事务。db.Transaction 为什么没报错却没提交因为 db.Transaction 默认只执行你传进去的函数不检查返回值、也不捕获 panic。如果函数里忘了 tx.Commit()又没显式 tx.Rollback()事务在连接归还给池时就静默丢弃了——数据既没写进去也没回滚连错误都没有。必须在事务函数开头加 defer tx.Rollback() 做兜底成功路径上要显式调用 tx.Commit()不能靠函数返回 nil 自动提交别在中间 return改用命名返回值或统一出口比如 err : ...; if err ! nil { return err }若函数 panicdefer tx.Rollback() 会生效但若只是逻辑错误如条件跳过 commit那就真丢了AfterCommit 钩子为啥不触发tx.AfterCommit() 只在 tx.Commit() 成功后才调用且严格绑定当前 *gorm.DB 实例——它不跨 session、不跨 goroutine、不继承到新 db 对象。钩子注册必须写在 db.Transaction 函数体内且要在 tx 创建后立刻调用比如 tx.AfterCommit(func() { ... })如果在事务里用了 tx.Session(...) 或 tx.WithContext(...) 新建了 *gorm.DB钩子就失效了钩子里别做 HTTP 请求、远程日志等耗时操作建议发消息到 chan 或投递异步任务多个 AfterCommit 按注册顺序执行但彼此无原子性一个 panic 不影响另一个嵌套事务其实是 savepoint怎么安全用GORM 没有真正的嵌套事务db.Transaction 套 db.Transaction 实际是用 SAVEPOINT 模拟的。外层 rollback 会让所有 savepoint 失效但你的代码若还去 ROLLBACK TO SAVEPOINT就会报 ERROR: no such savepoint。 Mokker AI AI产品图添加背景