В производственной базе данных SQL Server 2000 возникают очень неприятные тупиковые ситуации.
Основные настройки следующие:
- SQL Server 2000 Enterprise Edition.
- Сервер написан на C ++ с использованием базы данных ATL OLE.
- Все объекты базы данных доступны через хранимые процедуры.
- Все хранимые процедуры UPDATE / INSERT заключают свои внутренние операции в блок BEGIN TRANS ... COMMIT TRANS.
Я собрал некоторые начальные трассировки с помощью SQL Profiler после нескольких статей в Интернете, таких как эта ( игнорируйте, что это относится к инструментам SQL Server 2005, применяются те же принципы ). Судя по трассировкам, между двумя запросами UPDATE возникает тупик.
Мы приняли некоторые меры, которые могли бы снизить вероятность возникновения проблемы:
- ВЫБРАТЬ С (NOLOCK) . Мы изменили все запросы SELECT в хранимых процедурах, чтобы использовать WITH (NOLOCK). Мы понимаем последствия грязного чтения, но запрашиваемые данные не так важны, так как мы выполняем много автоматических обновлений и в нормальных условиях пользовательский интерфейс будет иметь правильные значения.
- ЧИТАТЬ НЕОГРАНИЧЕННЫЙ . Мы изменили уровень изоляции транзакции в коде сервера, чтобы он стал ЧИТАТЬ НЕКОММИТИРОВАННЫМ.
- Сокращенный объем транзакции . Мы сократили время удержания транзакции, чтобы минимизировать вероятность возникновения тупика базы данных.
Мы также подвергаем сомнению тот факт, что у нас есть транзакция внутри большинства хранимых процедур (блок BEGIN TRANS ... COMMIT TRANS). В этой ситуации я предполагаю, что уровень изоляции транзакции SERIALIZABLE, верно? А что, если у нас также есть уровень изоляции транзакции, указанный в исходном коде, который вызывает хранимую процедуру, которая применяется?
Это приложение с интенсивной обработкой, и мы часто обращаемся к базе данных для чтения (больший процент) и некоторых записей.
Если бы это была база данных SQL Server 2005, я мог бы пойти с Джефф Далгас ответил на тупиковую проблему, касающуюся переполнения стека , если это даже применимо к проблеме, с которой я сталкиваюсь , Но в настоящее время обновление до SQL Server 2005 не является приемлемым вариантом.
Поскольку эти первоначальные попытки потерпели неудачу, мой вопрос: Как бы вы пошли отсюда? Какие шаги вы бы предприняли, чтобы уменьшить или даже избежать тупика, или какие команды / инструменты я должен использовать, чтобы лучше разоблачить проблему?