Welcome to MSDN Blogs Sign in | Join | Help

Гайдар Магдануров

Платформа и инструменты разработки, новости компании Microsoft и мысли об ИТ
Транзакции в 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();
        }
    }
}

Posted: Wednesday, September 05, 2007 12:27 PM by gaidar
Filed under:

Comments

edy said:

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

# September 5, 2007 8:32 AM

gaidar said:

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

using (TransactionScope ts = new TransactionScope())

{

   ...

   dc.SubmitChanges();

   ts.Complete();

}

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

# September 5, 2007 11:33 AM
New Comments to this post are disabled
Page view tracker