英文:
Do you need to call transaction.RollBack if transaction.Commit fails for SQLX with posgres connection
问题
我正在使用https://pkg.go.dev/github.com/jmoiron/sqlx@v1.2.0来连接到PostgreSQL并执行查询。如果我的事务提交失败,我应该执行transaction.Rollback吗?
示例:
tx, err := appState.PgConn.Beginx()
if err != nil {
return err
}
// 然后使用tx引用进行一些查询
在提交事务之后,我们应该使用哪种方法:
方法1:
err := tx.Commit()
if err != nil {
return err
}
还是应该使用方法2:
err1 := tx.Commit()
if err1 != nil {
err2 := tx.Rollback()
if err2 != nil {
return err2
}
}
英文:
I am using
https://pkg.go.dev/github.com/jmoiron/sqlx@v1.2.0
to connect to postgres and do queries.
Should I do transaction.Rollback if my transaction.Commit fails
Example
tx, err := appState.PgConn.Beginx()
if err != nil {
return err
}
// then some queries using this tx reference
After that when we commit the transaction should we do ..
Approach 1
err:= tx.Commit()
if err != nil {
return err;
}
or should we use
Approach 2
err1 := tx.Commit()
if err1 != nil {
err2:= tx.Rollback()
if err2 !=nil {
return err2
}
}
答案1
得分: 3
sqlx Tx类型是对sql.Tx
的封装,该类型的文档说明如下:
>在调用Commit或Rollback之后,事务上的所有操作都会失败并返回ErrTxDone。
因此,在调用Commit
之后再调用Rollback
(无论成功与否)都不会产生影响(并且会返回ErrTxDone
)。你可以在这里的代码中看到这一点。这意味着在已经调用Commit
之后没有理由再调用Rollback
(所以使用第一种方法)。
英文:
The sqlx Tx type is a wrapper around sql.Tx
and the docs for that type state:
>After a call to Commit or Rollback, all operations on the transaction fail with ErrTxDone.
So calling RollBack
after Commit
(whether successful or not) will have no impact (and will return ErrTxDone
). You can see this in the code here. This means that there is no reason to call Rollback
after already calling Commit
(so use Approach 1).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论