1. ホーム
  2. c#

LINQ to SQLにおけるTransactionScopeとTransactionの比較

2023-09-28 05:19:04

質問

LINQ to SQLの古典的なトランザクションパターンは、どのような違いがありますか。

using(var context = Domain.Instance.GetContext())
{
    try
    {
        context.Connection.Open();
        context.Transaction = context.Connection.BeginTransaction();
        /*code*/
        context.Transaction.Commit();
    }
    catch
    {
        context.Transaction.Rollback();
    }         
}

vs TransactionScopeオブジェクト

using (var context = Domain.Instance.GetContext())
using (var scope = new TransactionScope())
{
    try
    {
        /*code*/
        scope.Complete();
    }
    catch
    {
    }
}

どのように解決するのですか?

Linq2SQLは暗黙のうちにトランザクションを使用します。 すべての更新が1つのSubmit内で行われる場合、自分でトランザクションを処理する必要はないかもしれません。

ドキュメントより(強調)。

SubmitChanges を呼び出すと、LINQ to SQL はその呼び出しが Transaction のスコープ内にあるかどうか、あるいは Transaction プロパティ (IDbTransaction) がユーザーが開始したローカルトランザクションに設定されているかどうかを確認します。 もしどちらのトランザクションも見つからなかったら、LINQ to SQL はローカルトランザクション (IDbTransaction) を開始し、生成された SQL コマンドを実行するためにそれを使用します。 すべてのSQLコマンドが正常に完了すると、LINQ to SQLはローカルトランザクションをコミットし、戻ります。