go data_error ai_generated true

错误:sql:事务已提交或回滚

error: sql: transaction has already been committed or rolled back

ID: go/database-sql-transaction-commit-before-rollback

其他格式: JSON · Markdown 中文 · English
80%修复率
88%置信度
0证据数
2025-06-15首次发现

版本兼容性

版本状态引入弃用备注
1.20 active
1.21 active

根因分析

尝试提交或回滚已最终确定的事务,通常由于重复调用或逻辑错误。

English

Attempting to commit or rollback a transaction that has already been finalized, often due to double call or logic error.

generic

解决方案

  1. 95% 成功率 Use a helper function to manage transaction lifecycle
    func withTx(db *sql.DB, fn func(*sql.Tx) error) error {
        tx, err := db.Begin()
        if err != nil { return err }
        defer tx.Rollback()
        if err := fn(tx); err != nil { return err }
        return tx.Commit()
    }

无效尝试

常见但无效的做法:

  1. Calling Rollback after Commit in defer 80% 失败

    Defer executes after Commit, causing panic; use flag to check.