В статье предлагаются важные советы, как избежать взаимоблокировок в SQL Servers
Несмотря на то, что SQL Server за последние пару лет произошла огромная эволюция, пользователи по-прежнему регулярно сталкиваются с ситуациями взаимоблокировок. В идеале сервер базы данных должен иметь возможность получать несколько запросов, но это часто приводит к блокировке. Конфликты, в которых один процесс ожидает освобождения другого ресурса, называются блоками. А еще есть тупики.
Представьте ситуацию, когда один человек просит второго выпустить ресурс, а второй ждет, пока выпустит первый. В результате оба застряли в тупиковой ситуации. Ни один из процессов не может продолжаться, так как оба заблокированы и требуют, чтобы другой освободил ресурс или заблокировал.
Во время работы с SQL servers, взаимоблокировки довольно распространены, и они могут помешать всему процессу. Невозможно полностью избежать взаимоблокировок, но можно свести к минимуму вероятность возникновения взаимоблокировки.
Проблема тупика

Следует отметить, что взаимоблокировки напрямую влияют на производительность и могут привести к остановке обработки базы данных.
1. Сохраняйте порядок
Взаимоблокировки неизбежны, если ресурсы обрабатываются не в четко определенном порядке. Для минимизации взаимоблокировок все параллельные транзакции должны обращаться к объектам в четко определенном порядке. Администраторы баз данных должны разработать четкий набор правил для доступа к объектам базы данных. Обычно мониторы блокировок выполняют проверку на наличие взаимоблокировок, и при обнаружении выбирают жертву взаимоблокировки и откатывают ее транзакцию. Таким образом, все блокировки снимаются, и предыдущие сессии могут продолжить процесс. Жертвы взаимоблокировок выбираются на основе приоритета взаимоблокировки, установленного сервером, или стоимости отката.
2. Ограничение во время транзакции
Вы можете запретить пользователям вводить любые данные во время обработки транзакции, и вы можете обновить данные до транзакции, чтобы избежать взаимоблокировок. Кроме того, постарайтесь свести взаимодействие с пользователем к минимальному уровню, потому что это влияет на скорость. В идеале транзакции должны быть короткими и быстрыми, чтобы избежать взаимоблокировок. Приложение должно быть спроектировано таким образом, чтобы оно захватывало блокировки за наименьшее время и освобождало их как можно быстрее.
3. НОЛОК Подсказка
Когда кто-то выполняет запрос к таблице на уровне изоляции SQL по умолчанию, таблица блокируется, и следующие запросы должны ждать освобождения. Подсказка NOLOCK полезна в таких ситуациях, так как позволяет переопределить блокировку таблицы и получить легкий доступ к другим запросам.
4. Используйте связанные соединения
Если одно и то же приложение может открывать два или более соединения, которые могут взаимодействовать друг с другом, то оно не будет создавать взаимоблокировки. Вот почему рекомендуется использовать связанные соединения.
Взаимоблокировки — не единственная неприятность, с которой вы, вероятно, столкнетесь при работе над SQL Server база данных. На самом деле инциденты sql-повреждение с большей вероятностью причинят вам горе. Чтобы избежать сценария потери данных, инвестируйте в мощный инструмент восстановления, такой как DataNumen SQL Recovery.
Об авторе:
Виктор Саймон — эксперт по восстановлению данных в DataNumen, Inc., которая является мировым лидером в области технологий восстановления данных, включая восстановление mdb и программные продукты для восстановления sql. Для получения дополнительной информации посетите https://www.datanumen.com/