在SQL中隔离提交事务

时间:2010-08-13 06:34:31

标签: sql transactions

我有一个n层C#ASP .Net应用程序服务器,它使用存储过程与数据库通信。

我有一个服务层,如果使用TransactionScope.requiresNew抛出异常,它会回滚所有ADO .net事务。

在我的存储过程中,我想跟踪登录尝试次数,因此我们希望按原样保留事务框架,但希望有一个我们提交的独立事务。

我该怎么做?

我尝试在数据层中使用新的TransactionScope.RequiresNew,但这没有效果。

1 个答案:

答案 0 :(得分:0)

奇怪 - 需要新的内部(日志记录)TransactionScope应该可以工作。

在下面的嵌套事务中,TransactionScopeOption.Suppress或TransactionScopeOption.RequiresNew都适用于我 - 内部事务已提交(Dal2.x),外部事务已中止(Dal1.x)。

    try
    {
        using (TransactionScope tsOuter = new TransactionScope(TransactionScopeOption.Required))
        {
            DAL1.Txn1();
            using (TransactionScope tsLogging = new TransactionScope(TransactionScopeOption.Suppress))
            {
                DAL2.Txn2();
                tsLogging.Complete();
            }
            throw new Exception("Big Hairy Exception");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

编辑:应避免混合使用TransactionScope和显式T-SQL事务 - 这在您引用的同一链接中说明,http://msdn.microsoft.com/en-us/library/ms973865.aspx,引用如下

TransactionScopes非常智能地管理事务升级 - 他们将使用(例如,只有当事务跨越多个数据库或资源时才使用DTC - 例如SQL和MSMQ)。它们还可以使用SQL 2005+轻量级事务,因此在事务中也可以管理到同一数据库的多个连接,而不会产生DTC的开销。

恕我直言,关于是否使用Suppress vs RequiresNew的决定将取决于你是否需要在一个事务中进行审计 - RequiresNew是一个孤立的txn,vs Suppress for none。

  

使用System.Transactions时,   申请不应直接   利用交易编程   资源管理器上的接口   例如T-SQL BEGIN TRANSACTION或   COMMIT TRANSACTION动词,或者   MessageQueueTransaction()对象   System.Messaging命名空间,何时   处理MSMQ。那些机制   会绕过分布式的   交易管理由   System.Transactions,并结合使用   使用System.Transactions与这些   资源经理“内部”   交易会导致不一致   结果....永远不要混合两个