首页 > 后端开发 > Golang > 如何安全地确定数据库/sql 事务的状态而不出现错误?

如何安全地确定数据库/sql 事务的状态而不出现错误?

Barbara Streisand
发布: 2024-12-12 22:47:18
原创
297 人浏览过

How Can I Safely Determine the Status of a database/sql Transaction Without Errors?

数据库/sql Tx:检测事务状态

问题:

如何确定使用数据库/sql的事务是否已提交或回滚而不触发错误?

答案:

要检测交易状态,请遵循以下最佳实践:

1.将事务保留在函数内:

确保在同一函数内调用 Begin()、Commit() 和 Rollback()。这可确保无缝跟踪交易。

2.利用 Defer 来关闭事务:

合并延迟函数以在必要时执行回滚。这保证了正确的交易处理。

3.简洁的事务处理程序:

实现事务处理程序函数来封装事务,确保简洁和正确处理。

代码示例:

import "database/sql"

func Transact(db *sql.DB, txFunc func(*sql.Tx) error) (err error) {
    tx, err := db.Begin()
    if err != nil {
        return
    }
    defer func() {
        if p := recover(); p != nil {
            tx.Rollback()
            panic(p)
        } else if err != nil {
            tx.Rollback()
        } else {
            err = tx.Commit()
        }
    }()
    err = txFunc(tx)
    return err
}
登录后复制

使用交易handler:

func (s Service) DoSomething() error {
    return Transact(s.db, func(tx *sql.Tx) error {
        if _, err := tx.Exec(...); err != nil {
            return err
        }
        if _, err := tx.Exec(...); err != nil {
            return err
        }
        return nil
    })
}
登录后复制

处理恐慌:

利用recover()捕获恐慌并确保及时回滚。如果需要的话,重新引发恐慌以允许处理。

GC 和 Tx 对象:

在提交或回滚后将 Tx 设置为 nil 不会自动释放内存。相反,依靠垃圾收集器来处理这个问题。

以上是如何安全地确定数据库/sql 事务的状态而不出现错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板