次の方法で共有


Транзакции в 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

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

  • Anonymous
    September 05, 2007
    Это тоже возможно, в этом случае просто объявляете TransactionScope как обычно: using (TransactionScope ts = new TransactionScope()) {    ...    dc.SubmitChanges();    ts.Complete(); } И среда берет на себя работу по созданию транзакции.