2011-03-22 38 views
1

我在ASP.NET/SQL Server 2005中使用SubSonic工作时发生多重删除事务时遇到了一些问题。它似乎总是会在数据库中进行更改,即使没有调用transactionscope对象的完整方法?无法使用SubSonic处理事务

我一直在阅读有关这方面的文章,并尝试过各种替代方案(切换我使用的语句的顺序),使用DTC,不使用DTC等,但迄今为止没有喜悦。

我打算假设这是我的代码,这是问题,但我无法发现问题 - 任何人都可以提供帮助吗?我使用的是SubSonic 2.2。下面的代码示例:

using (TransactionScope ts = new TransactionScope()) 
      { 
       using (SharedDbConnectionScope sts = new SharedDbConnectionScope()) 
       { 
        foreach (RelatedAsset raAsset in relAssets) 
        { 
         // grab the asset id: 
         Guid assetId = new Select(RelatedAssetLink.AssetIdColumn) 
          .From<RelatedAssetLink>() 
          .Where(RelatedAssetLink.RelatedAssetIdColumn).IsEqualTo(raAsset.RelatedAssetId).ExecuteScalar<Guid>(); 

         // step 1 - delete the related asset: 
         new Delete().From<RelatedAsset>().Where(RelatedAsset.RelatedAssetIdColumn).IsEqualTo(raAsset.RelatedAssetId).Execute(); 

         // more deletion steps... 
        } 

        // complete the transaction: 
        ts.Complete(); 
       } 
      } 

回答

1

您使用语句的顺序是正确的(我记得为了自己用这一招:连接需要了解该交易在其建立后,它通过检查`系统确实是.Transactions.Transaction.Current)。

一个提示:你不需要使用双括号。你不需要对SharedDbConnectionScope()的引用。 这看起来更具可读性。

using (var ts = new TransactionScope()) 
using (new SharedDbConnectionScope()) 
{ 
    // some db stuff 

    ts.Complete(); 
} 

无论如何,我没有看到,为什么这不应该工作。 如果问题与MSDTC有关,则会发生异常。

我只能想象,SqlServer 2005配置中存在问题,但我不是SqlServer专家。

也许你应该尝试一些演示代码来验证交易工作:

using (var conn = new SqlConnection("your connection String"); 
{ 
    conn.Open(); 
    var tx = conn.BeginTransaction(); 

    using (var cmd = new SqlCommand(conn) 
     cmd.ExecuteScalar("DELETE FROM table WHERE id = 1"); 

    using (var cmd2 = new SqlCommand(conn) 
     cmd2.ExecuteScalar("DELETE FROM table WHERE id = 2"); 


    tx.Commit(); 
} 

而且亚音速支持本地事务不使用的TransactionScope:http://subsonicproject.com/docs/BatchQuery