Проблема взаимоблокировки с SQL Server 2008 и ADO.NET - PullRequest
0 голосов
/ 08 сентября 2010

В наших приложениях мы не используем ни транзакции ADO.NET, ни транзакции SQL Server в процедурах, и теперь мы получаем следующую ошибку на нашем веб-сайте, когда ее используют несколько человек.

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

Является ли эта ошибка из-за отсутствия транзакций?Я думал, что согласованность будет обрабатываться самой БД.

И еще одна вещь, которую я заметил, что свойство SQLCommand.Timeout установлено в 10000. Будет ли это причиной ошибки?

Я пытаюсь решить эту проблему как можно скорее.Пожалуйста, помогите.

EDIT

Я видел свойство Isolationlevel транзакции ADO.NET, поэтому, если я использую транзакцию ADO.NET с соответствующим свойством изоляции уровня, например, ReadUncommitted,чтение и "Сериализуемый" во время письма?

Ответы [ 2 ]

2 голосов
/ 08 сентября 2010

Каждый оператор SQL DML (INSERT, UPDATE, DELETE) или DQL (SELECT) выполняется внутри транзакции. Поведение по умолчанию для SQL Server заключается в том, что он открывает новую транзакцию (если она не существует) и, если инструкция завершается без ошибок, автоматически фиксирует транзакцию.

Поведение IMPLICIT_TRANSACTIONS, о котором упоминает Сидхарт, в основном заставляет SQL Server несколько изменить свое поведение - оно оставляет транзакцию открытой после завершения инструкции.

Чтобы получить более подробную информацию в журнале ошибок SQL Server, вы можете включить флаг трассировки . Затем будет указано, какие соединения были задействованы в тупике (а не только тот, который был убит) и какие ресурсы были задействованы. После этого вы сможете определить, какой тип поведения ведет к тупикам.

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

0 голосов
/ 08 сентября 2010

IsolationLevel - ваш лучший выбор. Уровень сериализации транзакций по умолчанию - «Сериализуемый», который является наиболее строгим, и если на этом уровне существует циклическая ссылка, шансы тупика очень высоки. Установите для него значение ReadCommitted во время чтения, и пусть он будет сериализуемым во время записи.

Сервер SQL может использовать неявные транзакции, что может происходить в вашем случае. Попробуйте отключить его:

SET IMPLICIT_TRANSACTIONS OFF;

Читайте об этом здесь: http://msdn.microsoft.com/en-us/library/ms190230.aspx

...