#sql #database #tsql
#sql #База данных #tsql
Вопрос:
Возможно, я неправильно понял природу блокировок таблиц, но мне было интересно, возможно ли иметь цепные реакции блокировок в некоторых таблицах
Я не знаю, насколько большой может быть область действия БД, но рассмотрите около 200 таблиц БД и сотни / тысячи хранимых процедур. Если в какой-то момент одна процедура блокирует одну таблицу, и, следовательно, какая-то другая процедура сталкивается с блокировкой, но ей каким-то образом удается заблокировать другую таблицу из-за первой блокировки, и это снова и снова до точки, когда все процедуры блокируют друг друга в некоторой бесконечной цепочке.
Таким образом, мы получаем блокировки и тайм-аут везде, пока все службы, вызывающие эти процедуры, не будут остановлены и перезапущены с исправлением основной причины в начальной процедуре.
Возможен ли этот сценарий в любом случае?
Комментарии:
1. Взаимоблокировка может соответствовать тому, что вы описываете, и да, они могут произойти.
2. Вот почему разработчики должны заботиться о запросах и транзакциях и не использовать, например, длинные транзакции или глобальные соединения. Оба ADO.NET и EF, EF Core, NHibernate созданы для работы без постоянно открытого соединения, поэтому такие взрывы блокировок никогда не должны происходить — если, например, кто-то не запускает дефрагментацию таблицы во время работы каждой службы. Плохие методы кодирования, такие как использование
NOLOCK
для сокрытия проблем параллелизма, также требуют большего количества блокировок на уровне таблицы , что может привести к зависанию всего, даже если в таблице было изменено всего несколько строк3. Например
If at some point one procedure is locking one table
, почему хранимая процедура должна это делать, если это не хранимая процедура обслуживания?4. @TimBiegeleisen Правильно! Я ссылался на блокировку и взаимоблокировку как на один и тот же термин, я не знал, что взаимоблокировка была объектом, ожидающим другого. Таким образом, мертвая блокировка может определенно вызвать другую, верно?
5. @PanagiotisKanavos вставка и обновление блокируют строки, нет? Поэтому, если некоторые параллельные службы используют одну и ту же процедуру, они всегда должны обращаться к разным ресурсам, это точно. Но если одна из служб в конечном итоге не справится со своей задачей и создаст блокировку, затрагивающую другие службы, которые запрашивают ту же таблицу, произойдет взаимоблокировка