Транзакции в LINQ


Способ организации транзакции с использованием объекта типа System.Data.Common.DbTransaction:


public void ProcessPayment(Guid creditId, Guid debitId, long amount)
{


    DbTransaction transaction;
    MyDataContext dc = new MyDataContext();


    try
    {
    // соединение должно быть открыто до инициирования транзакции
    dc.Connection.Open();
    transaction = dc.Connection.BeginTransaction();


    // присвоение транзакции текущему контексту данных
    dc.Transaction = transaction;


    // выполняем операции
    var credit = dc.Credits.Single(c => c.CreditId == creditId);
    credit.Value = credit.Value + amount;
    var debit = dc.Debits.Single(d => d.DebitId == debitId);
    debit.Value = debit.Value - amount;


    // подтверждение транзакции
    transaction.Commit();
           
    }
    catch (Exception ex)
    {
        if(transaction != null)
        {
            transaction.Rollback();
        }               
    }
    finally
    {
        // на всякий случай неплохо бы закрыть соединение принудительно
        if(dc.Connection.State != ConnectionState.Closed)
        {
             dc.Connection.Close();
        }
    }
}

Comments (2)
  1. edy says:

    Почему не использовать TransactionScope для этих целей?

  2. Это тоже возможно, в этом случае просто объявляете TransactionScope как обычно:

    using (TransactionScope ts = new TransactionScope())

    {

       …

       dc.SubmitChanges();

       ts.Complete();

    }

    И среда берет на себя работу по созданию транзакции.

Comments are closed.

Skip to main content