数据库/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中文网其他相关文章!