2011-03-22 88 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