web-dev-qa-db-ja.com

データコンテキストでトランザクションを使用する方法

エラー後にコンテキストの状態をロールバックできるように、データコンテキストでトランザクションを使用できますか?もしそうなら、それはどのように機能しますか?

17
user107534

私はいつもテストにそれらを使用しています:)

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

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

[〜#〜] update [〜#〜]

これは、事後に常にロールバックされます。私はこれをテストに使用します。

18
leppie

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

15
Richard

これは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();
    }
}

もちろん、RollBackは、を使用してさらにデータ操作を行う場合にのみ必要です。それ以外の場合、変更は自動的に破棄されます。

12
Damien

このようなもの、おそらく:

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
}
10
Philippe

このようなものです:

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();
   }
}
0
Nițu Alexandru