也许这是一个非常棒的问题,因为我对使用PetaPoco进行交易还不是很新。 问题我使用PetaPoco作为microORM来处理我的db事务是因为如果我在事务的.Complete()方法之前抛出异常,所有内容都会正确回滚但是如果我在
Using scope As PetaPoco.Transaction = db.GetTransaction()
' try/catch here and if the db command fails transaction won't roll back
scope.Complete()
End Using
如果其中一个数据库操作失败,事务将不会回滚。我该如何解决这个问题?
答案 0 :(得分:2)
问题是我没有正确处理“调用/不调用”scope.Complete()基于沿路径截获的异常。 特别是我有一个布尔标志“rollBackTransaction”开始为false,然后如果事务中的任何try / catch块引发异常,则更新为true。 最后我刚检查了一下:
If Not rollBackTransaction Then
scope.Complete()
End If
这也适用于Simon提出的TransactionScope,如果在关闭Using块之前未调用.Complete(),最终将回滚事务。
现在是什么原因造成了一个错误的标志,因此每次都调用scope.Complete()方法,就是我在事务中调用了一个sub,它有自己的异常处理,因此永远不会在主事务块中引发异常正确更新“rollBackTransaction”标志。
我学到的是,如果你在事务中使用try / catch,请确保你调用的外部方法在它们掉落时引发异常,并根据你将调用范围一直更新一个标志。完整()。
无论如何Simon,谢谢你指出我不知道的.NET功能似乎非常有用! 想知道它还包括在交易...文件系统更改?