2011-03-22 12 views
1

ASP.NET/SQL Server 2005에서 SubSonic을 사용하여 다중 삭제 트랜잭션을 처리하는 데 약간의 문제가 있습니다. 데이터베이스에서 항상 변경 사항을 transactionscope 객체에 대한 complete 메소드를 호출 하시겠습니까?SubSonic을 사용하여 트랜잭션을 가져 오는 중 문제가 발생했습니다.

나는 이것에 관한 게시물을 읽었으며 DTC를 사용하여 DTC를 사용하는 등 다양한 대안을 시도했다. 그러나 지금까지는 기쁨이 없었다.

나는 이것이 문제는 내 코드라고 생각 하겠지만 문제를 발견 할 수는 없습니다. 누구든지 도울 수 있습니까? 나는 SubSonic 2.2를 사용하고있다. 코드 샘플은 아래 : 연결이 생성되는 동안 트랜잭션에 대해 알 필요가있다, 그것은`시스템을 확인하여 해당합니까 : 당신의 using 문의

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

순서 올 (I이 트릭 순서 나 자신을 기억 .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

어쩌면 당신은 트랜잭션이 작동하는지 확인하기 위해 몇 가지 데모 코드를 시도해야한다