Go中db.Exec和tx.Commit的错误必须显式检查,因database/sql不自动panic,忽略error会导致事务未回滚、数据不一致;每步操作及Commit均需判错,Rollback须在出错时调用且仅一次。
Go 中 db.Exec 和 tx.Commit 的错误必须显式检查
Go 的 database/sql 不会自动 panic 或中断执行,所有数据库操作返回的 error 都必须手动判断。忽略 err 是导致事务未回滚、数据不一致的最常见原因。
典型错误写法:_, _ = db.Exec("INSERT ...") —— 这等于主动丢弃错误,后续也无法回滚。
正确做法是逐层检查,尤其在事务中:
-
tx, err := db.Begin()后必须检查err != nil - 每条
tx.QueryRow/tx.Exec后都要检查err -
tx.Commit()本身也可能失败(如连接断开、约束冲突),也得检查
事务回滚必须调用 tx.Rollback(),且只应在出错时调用一次
tx.Rollback() 不是“撤销已执行语句”,而是向数据库发送 ROLLBACK 命令,终止当前事务并释放锁。它本身也会返回 error(例如连接已关闭),但通常可忽略——只要确保它被调用了。
常见误区: