Как использовать транзакцию в LINQ to SQL с использованием хранимых процедур? - PullRequest
5 голосов
/ 02 июня 2009

У меня есть фрагмент кода, который выглядит примерно так (ClearImportTable и InsertPage являются хранимыми процедурами):

datacontext.ClearImportTable() //Essentially a DELETE FROM table
for (int i = 1; i < MAX_PAGES; ++i){
    datacontext.InsertPage(i); //Inserts data into the table
}

Это несколько упрощенная версия моего кода, но идея в том, что он очищает таблицу перед вставкой записей. Единственная проблема состоит в том, что если ошибка возникает после ClearImportTable, все данные из таблицы стираются. Есть ли способ обернуть это в транзакции, чтобы в случае возникновения ошибок все вернулось на прежнее место?

Ответы [ 3 ]

11 голосов
/ 02 июня 2009

Вы можете сделать объем транзакции:

 using (var transaction = new TransactionScope())
 {
     // do stuff here...
     transaction.Complete();
 }

Если возникает исключение или блок using остается без нажатия транзакции .Complete (), тогда все выполненное в блоке using откатывается.

Вам нужно будет обратиться к сборке System.Transactions.

9 голосов
/ 02 июня 2009

Как упомянуто выше «Парусное дзюдо», я с большим успехом использовал блоки TransactionScope, когда мне нужно вызывать хранимые прокы. Однако есть одна «ошибка», с которой я столкнулся, когда возникает исключение, говорящее, что «транзакция под вопросом». Чтобы обойти это, я должен был вызвать метод nondeferred в proc, чтобы он немедленно оценивал результат. Так что вместо

using (var transaction = new TransactionScope())
{
    var db = new dbDataContext();

    db.StoredProc();
    transaction.Complete();
}

Я должен был назвать это так ...

using (var transaction = new TransactionScope())
{
    var db = new dbDataContext();

    db.StoredProc().ToList();
    transaction.Complete();
}

В этом примере ToList () может быть любым неотложенным методом, который заставляет LINQ немедленно оценить результат.

Я предполагаю, что это потому, что ленивый (отложенный) характер LINQ плохо играет со временем транзакции, но это только предположение. Если бы кто-нибудь мог пролить больше света на это, я бы хотел услышать об этом.

0 голосов
/ 02 июня 2009

Установить свойство Transaction для DataContext?

...