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是一款自动视频编辑工具,可以将文本、文章或故事转换为视频。
相关推荐
奇特認1 小时前
mysql 集群技术 3.高可用之 MHABioinfo Guy4 小时前
高分Panel复现系列|转录因子网络太乱?用模块框把重点圈出来leisoo80974 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比WangYan20224 小时前
基于XGBoost与AI的生态—地学多源数据建模:植被与土地利用识别、土壤碳氮空间预测、生物多样性驱动机制、土壤微生物功能预测、生态退化与风险识别ltl5 小时前
Disaggregated DB 合集:Socrates、PolarDB、Taurus 的共同模式金銀銅鐵6 小时前
[Python] 借助 turtle 逐字展示唐诗《金缕衣》Blossom i7 小时前
大数据预处理与采集实验一:使用Python操作MySQL数据库雾时之林8 小时前
Linux--软件管理、源码包安装Python大数据分析@8 小时前
使用大模型MCP采集数据,爬虫已经无门槛quantdash_cc8 小时前
告别自建 Requests/BS4 网页爬虫:基于 QuantDash 搭建零维保的高性能量化行情流水线