Транзакции в 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(); } И среда берет на себя работу по созданию транзакции.