2013-12-22 115 views
1

也许这是一个真正的小问题,因为我对于处理与PetaPoco的交易相当新。 问题我正在使用PATA作为一个microORM来处理我的数据库事务,如果我在事务的.Complete()方法之前抛出一个异常,所有事情都会正确回滚,但如果我在PetaPoco交易不回滚

内部捕获异常
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

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

+0

我不熟悉PetaPoco交易。但是,快速查看PetaPoco的代码,事务管理在Microsoft环境中似乎很有趣并且坦率地说是无用的。你为什么不用一个标准的TransactionScope使用语句来包围你的事务代码(就像这样:http://msdn.microsoft.com/library/ee818746.aspx),它对于大多数标准数据库来说应该是正常的。 –

+0

谢谢西蒙,我觉得petapoco在底层使用的是这个对象infact,即使是petapoco,你也不能“手动”回滚事务,但它的工作原理就像“如果你想回滚一个事务,你不应该调用Complete方法例如,你可以在范围内抛出异常,它参与的事务将被回滚。“ 但由于某种原因,我试图不叫.Compete(),但第一个数据库查询成功了相同。顺便说一句,我会给一个普通的.NET方法一个镜头,并在这里报告。 – Manight

回答

2

问题是我没有正确处理“调用/未调用”scope.Complete()基于沿路径截获的异常。 特别是我有一个布尔标志“rollBackTransaction”从false开始,然后更新为true,如果事务内的任何try/catch块引发和异常。 最后我刚刚检查了它:

    If Not rollBackTransaction Then 
         scope.Complete() 
        End If 

这可如果.Complete()不关闭使用块之前调用中使用,以及由西蒙至极建议最终会回滚事务中的TransactionScope。

现在什么导致了一个假标志,因此每次调用scope.Complete()方法时,我在事务内部调用了一个子对象,它拥有自己的异常处理,因此永远不会在主事务中引发异常块来正确更新“rollBackTransaction”标志。

我学到的是,如果您在事务内部使用try/catch,请确保您调用的外部方法在引发异常时引发异常,并根据您将调用的作用域一直更新标志。完成()。

无论如何西蒙,感谢指出,我不知道的.NET功能似乎是非常有用的! 不知道它会包含在交易中......文件系统的变化?