TransactionScope и взаимоблокировки в sproc - PullRequest
1 голос
/ 04 июля 2011

У меня есть sproc, который в основном идет:

begin transaction
    SELECT
    UPDATE
    INSERT
commit transaction

Этот sproc вызывается внутри цикла из двух разных потоков в моем приложении, оба в пределах TransactionScope с параметрами по умолчанию.

Время от времени мои приложения блокируются:

"Транзакция (идентификатор процесса 184) блокируется на ресурсах блокировки другого процесса и выбирается в качестве жертвы тупика. Повторите транзакцию."

Что я могу с этим поделать?Должен ли я использовать другой уровень изоляции?

1 Ответ

2 голосов
/ 04 июля 2011

Уровень изоляции по умолчанию, используемый TransactionScope, - Serializable, который обычно не требуется.Используйте конструктор , который принимает TransactionOptions для указания другого уровня.

Пример на основе сообщения в блоге от Дэвид Бакстер Браун (отличный пост в блоге, описывающийэта проблема).

TransactionOptions tOptions= new TransactionOptions();
tOptions.IsolationLevel = IsolationLevel.ReadCommitted;
using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required, tOptions))
{
  // do stuff here
}
...