C# 使用具有亚音速的事务

C# 使用具有亚音速的事务,c#,asp.net,web-applications,subsonic,transactions,C#,Asp.net,Web Applications,Subsonic,Transactions,在我的web应用程序中,我必须对用户操作进行审计。所以,每当用户采取行动时,我都会更新要采取行动的对象,并对该行动进行审计跟踪 现在,如果我首先修改对象,然后更新审计跟踪,但审计跟踪失败,那么怎么办 显然,我需要回滚对修改对象的更改。我可以在简单的应用程序中使用Sql事务,但我使用亚音速与db对话。我如何处理这种情况?类似于: Using ts As New System.Transactions.TransactionScope() Using sharedConnectionScope

在我的web应用程序中,我必须对用户操作进行审计。所以,每当用户采取行动时,我都会更新要采取行动的对象,并对该行动进行审计跟踪

现在,如果我首先修改对象,然后更新审计跟踪,但审计跟踪失败,那么怎么办

显然,我需要回滚对修改对象的更改。我可以在简单的应用程序中使用Sql事务,但我使用亚音速与db对话。我如何处理这种情况?

类似于:

Using ts As New System.Transactions.TransactionScope()
  Using sharedConnectionScope As New SubSonic.SharedDbConnectionScope()

' Do your individual saves here

' If all OK
      ts.Complete()

   End Using
End Using
给出的结果完全正确。我把这篇文章翻译成了他对C代码的回答。我没有使用注释,因为它不会格式化代码:),而且我使用try/catch来知道事务是否应该完成或回滚

using (System.Transactions.TransactionScope ts = new TransactionScope())
{
    using (SharedDbConnectionScope scs = new SharedDbConnectionScope())
    {
        try
        {
            //do your stuff like saving multiple objects etc. here 

            //everything should be completed nicely before you reach this
            //line if not throw exception and don't reach to line below
            ts.Complete();
        }
        catch (Exception ex)
        {
            //ts.Dispose(); //Don't need this as using will take care of it.
            //Do stuff with exception or throw it to caller
        }
    }
}

没有。如果我将
SharedDbConnectionScope
放在外部,则在
ts.Complete()
之前的数据库中可以看到更改。将其放入服务器中会阻塞服务器,直到操作完成。

我可以确认TransactionScope在亚音速下正常工作,并正确回滚事务。谢谢@kevinw和@bnkdev。我使用的是C#,因此我将用C#发布代码,以便其他人可以轻松使用。另外,您不想将单个保存或操作放在try/catch中,以便更容易知道所有操作是否都正常吗?不需要在catch子句中调用
ts.Dispose()
,因为using语句将处理它。在一般情况下,它甚至可能导致问题,因为在事务作用域内启动的
SharedDbConnectionScope
或其他事务感知代码可能依赖于在释放封闭的事务作用域之前释放。@Oskarbergren对其进行了注释。这是否也处理存储过程内的操作?假设我调用多个执行CRUD操作的SP,这会还原所有内容吗?@GeomanYabes yes事务会传递到MS SQL server(如果您正在使用该服务器)。不确定其他数据库服务器。有人能告诉我这个吗?因此,除非当前交易完成,否则不会提供其他交易?i、 e.您有一个长期运行的事务,其他用户在事务完成之前不能与数据库交互?