2009-05-15 19 views

答えて

13

私は、これは常に事実の後にロールバックされます、すべての時間に:)

try 
{ 
    dc.Connection.Open(); 
    dc.Transaction = dc.Connection.BeginTransaction(); 

    dc.SubmitChanges(); 
} 
finally 
{ 
    dc.Transaction.Rollback(); 
} 

UPDATE

をテストする際にそれらを使用しています。私はこれをテストに使用します。おそらく、このような

+3

あなたはあなたのサンプル_always_はその作業に戻りますことを言及すべきである、または私は間違っているとdc.Transaction.Rollback(午前)(dc.SubmitChanges後に問題はありません)? – VVS

+0

-1:トランザクションを使用するブロックを使用する必要があります。 – Richard

+4

@リチャード:意味的に私のものと同じ '使用する'ブロックを使ってスニペットを待っています。 – leppie

9

何か、:

try 
{ 
    using (TransactionScope scope = new TransactionScope()) 
    { 
     //Do some stuff 

     //Submit changes, use ConflictMode to specify what to do 
     context.SubmitChanges(ConflictMode.ContinueOnConflict); 

     scope.Complete(); 
    } 
} 
catch (ChangeConflictException cce) 
{ 
     //Exception, as the scope was not completed it will rollback 
} 
+0

なぜダウン投票?少し説明すれば怪我をしないでしょう... – Philippe

+1

これまでのところ、これは最高の答えです。トランザクションのスコープは、行く方法です。これはConflictModeを指定し、少なくとも適切なエラー処理の形式を示唆します。良くやった。 – Triynko

+0

これは私のために働いた、ありがとう@philippe。 –

14

AのDataContextは、デフォルトでは、周囲のトランザクションをピックアップしますので、スコープのトランザクションがある確保するだけです。あなたは新しいトランザクションをしたいか、既存のトランザクション(例えば、監査/ログ操作はとても新しいトランザクションが必要になることがあります再利用してください

  • あなたは
  • (例えば分離レベルを)どのようなオプション必要です:詳細は、主な問題となって全体のビジネス操作が失敗して外部トランザクションがロールバックされた場合でもコミットできます)。

これはプロトタイプコードを単純化したもので、実際のコードではヘルパーを使用してポリシー駆動オプションを使用してトランザクションを作成しています(プロトタイプの目的の1つはこれらのオプションの影響を調べることでした)。

using (var trans = new TransactionScope(
          TransactionScopeOption.Required, 
          new TransactionOptions { 
           IsolationLevel = IsolationLevel.ReadCommitted 
          }, 
          EnterpriseServicesInteropOption.Automatic)) { 
    // Perform operations using your DC, including submitting changes 

    if (allOK) { 
     trans.Complete(); 
    } 
} 

Complete()が呼び出されないと、トランザクションはロールバックされます。トランザクションスコープが含まれている場合は、内部トランザクションと外部トランザクションの両方をコミットするデータベース上の変更に対して完了する必要があります。

+2

SQL ServerのIsolationLevel変更を含める場合は+1します。ここで説明します:http://blogs.msdn.com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx なぜEnterpriseServicesInteropOption.Automatic? –

+0

どこから来たのですか?私のインテリタイプはそれを拾っていません。 – Kukoy

+0

@Fritos:トランザクション内で実行されているコード(つまり、コメントの置換え)。 – Richard

9

これはTransactionScopeメソッドほど単純ではありませんが、理解しているように、これはLINQ-to-SQLに対して「正しい」方法です。 System.Transactionsへの参照は必要ありません。もちろん

dataContext.Connection.Open(); 
using (dataContext.Transaction = dataContext.Connection.BeginTransaction()) 
{ 
    dataContext.SubmitChanges(); 

    if (allOK) 
    { 
     dataContext.Transaction.Commit(); 
    } 
    else 
    { 
     dataContext.Transaction.RollBack(); 
    } 
} 

あなたが使用して内部にさらにデータ操作をするつもりならば、ロールバックは唯一それ以外の変更は自動的に破棄され、必要になります。

+0

どこから来たのですか?私のインテリタイプはそれを拾っていません。 – Kukoy

+4

@Fritos:これは擬似コード – abatishchev

+1

これは受け入れられた答えよりも簡単です。なぜそれが受け入れられた答えではないのか? – ChrisFox

0

はこのようなものです:

using (YourDatacontext m_DB = new YourDatacontext()) 
using (TransactionScope tran = new TransactionScope()) 
{ 
    try 
    { 
     //make here the changes 
     m_DB.SubmitChanges(); 
     tran.Complete(); 
    } 
    catch (Exception ex) 
    { 
     Transaction.Current.Rollback(); 
    } 
} 
関連する問題