【发布时间】:2013-04-24 05:45:26
【问题描述】:
使用 database/sql 和驱动程序包和 Tx,如果不尝试另一个事务并因此收到错误,然后检查错误以确定错误的类型。我希望能够从 Tx 对象中确定是否已提交。当然,我可以在使用 Tx 的函数中定义和设置另一个变量,但我有很多变量,每次都是 2 次(变量和赋值)。如果需要,我还有一个延迟函数来执行回滚,并且需要将它传递给 bool 变量。
在 Commit 或 Rollback 之后将 Tx 变量设置为 nil 是否可以接受,并且 GC 是否会恢复任何内存,或者这是一个禁忌,还是有更好的选择?
【问题讨论】:
-
不确定我是否理解问题所在。您必须使用 Commit 或 Rollback 结束事务,这样您才能知道自己做了什么,但又不想在额外的变量中记住这一点?您可以将 Tx 和 bool 包装在自己的 RememberingTx 中,这会稍微减少行数。关于 GC 问题:设置为 nil 与否都没有关系:一旦没有对它的引用,内存将被回收。所以:是的,你可以拥有
var tx *Tx; snip; if cond { tx.Commit; tx=nil } else { tx.Rollback}; snip; if tx==nil { was commited } else { was rollbacked},但感觉很难看。 -
就是这样,但是如果 Tx 不为零,则有一个延迟函数执行回滚。一旦提交了事务,Tx 无论如何都不能使用,所以我打算将它设置为 nil。它并不漂亮,但是尝试回滚并测试错误消息也不漂亮。问题是AFAIK无法测试交易是否从Tx“完成”。我不确定为什么要这样做,也许是性能。