Go事务失效主因是操作未绑定到同一sql.Tx:BeginTx后必须用tx.Exec()等,禁用db.Exec();Savepoint需手写SQL;context超时不中断已执行SQL;ORM传sql.Tx仅接口兼容,未必进事务。Go 里 BeginTx 和 Exec 不在同一个 *sql.Tx 上,事务就白做了事务失效最常见原因:没把后续操作绑定到事务对象上。比如用 db.BeginTx() 开启事务,但后面还用 db.Exec()(属于原始 *sql.DB),那这些语句根本不在事务里,各自自动提交。所有 SQL 操作必须调用 tx.Query()、tx.Exec()、tx.Prepare() 等,不能混用 db.Xxx()注意 sql.Tx 不是线程安全的,别跨 goroutine 复用如果用了 database/sql 的连接池,tx 会独占一个底层连接,直到 Commit() 或 Rollback()PostgreSQL 中 Savepoint 在 Go 里得手写 SQL,标准库不支持Go 标准 database/sql 没提供 Savepoint 接口,想实现嵌套回滚或部分回滚,只能手动执行 SAVEPOINT sp1 和 ROLLBACK TO SAVEPOINT sp1。必须确保 tx 支持该方言(PostgreSQL/MySQL 8.0+ 可以,SQLite 行,但 MySQL 5.7 不支持 SAVEPOINT)Savepoint 名字要自己管理,避免重复;建议用 uuid.NewString() 或带上下文前缀的字符串执行失败时,记得检查错误是否来自 savepoint 操作本身(比如语法错),别和业务逻辑错误混淆context.WithTimeout 传给 BeginTx,但事务超时后连接不一定立刻释放传入 context 控制事务生命周期是对的,但要注意:超时触发后,BeginTx 会返回 error,可如果已经拿到 *sql.Tx,它的底层连接不会自动关闭,得靠连接池空闲回收或 DB 设置 SetConnMaxLifetime。 Tellers AI Tellers是一款自动视频编辑工具,可以将文本、文章或故事转换为视频。
相关推荐
投票竞赛10 小时前
书法、绘画作品投票评选,图片投票小程序作品集排版金伟API102410 小时前
常见的SQL面试题:经典50例梦远青城10 小时前
Docker 部署python的paddle进行OCR文字识别身份证谜之锋10 小时前
银河麒麟 Debian 系统离线deb包安装Mariadb 数据库指南Leighteen11 小时前
MongoDB 文档模型设计:从关系型思维到文档型思维的转变编码者卢布11 小时前
【Azure APIM】APIM的诊断日志与Application Insights的日志是否可以串联为一个端到端的日志链路呢?小园子的小菜11 小时前
深入理解 JVM 垃圾回收:从对象判定、回收算法到经典收集器全解析CodexDave11 小时前
数据库连接池耗尽:排查顺序与三层兜底FriendshipT11 小时前
Ultralytics:解读CBLinear模块播播资源12 小时前
智能路由(AI Router):用“虚拟模型”撬动无限算力,从此告别手动切换