2010-01-13 3 views
14

Я пишу приложение на C#, которое обращается к базе данных SQL Server 2005. Приложение довольно интенсивно для базы данных, и даже если я попытаюсь оптимизировать весь доступ, настройте правильные индексы и т. Д. Я ожидаю, что рано или поздно я получу тупики. Я знаю, почему происходят взаимоблокировки базы данных, но я сомневаюсь, что смогу выпустить программное обеспечение без взаимоблокировок, возникающих в какой-то момент. Приложение использует Entity Framework для доступа к базе данных.Шаблоны для обработки SQL-тупика в C#?

Есть ли хороший шаблон для обработки SQLExceptions (deadlocked) в коде клиента C# - например, для повторного запуска пакета операторов после x миллисекунд?

уточнить; Я не ищу способ, как избежать взаимоблокировок в первую очередь (уровни изоляции, индексы, порядок инструкций и т. Д.), А скорее как обращаться с ними, когда они на самом деле происходят.

ответ

4

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

Рэнди

+1

Можете ли вы рассказать мне, как вы совершили фактическое повторение транзакции? Вы разместили простую петлю вокруг кода в любом месте, где у вас была транзакция, или вы придумали более общее решение? – martin

+1

Мы реализовали цикл. Если транзакция завершилась неудачно, из-за ситуации взаимоблокировки, мы перевернули всю транзакцию и снова попытались до 5 раз. –

6

Я отправил образец кода для обработки именно это некоторое время назад, но ТАК, казалось, потерял свой счет в промежутке времени, так что я не могу найти его сейчас я боюсь и не имеют код, который я использовал здесь.

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

(И если вы можете, попробуйте затыкать это в общей рутины и запускать большинство/все ваши доступа к БД через это так вы обработки ТУПИКИ всей программы.)

EDIT: Ах, научи меня не использовать Google! Предыдущий образец кода I и другие данные были указаны в How to get efficient Sql Server deadlock handling in C# with ADO?

Смежные вопросы