Возможно ли иметь цепную реакцию блокировок в БД?

#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 вставка и обновление блокируют строки, нет? Поэтому, если некоторые параллельные службы используют одну и ту же процедуру, они всегда должны обращаться к разным ресурсам, это точно. Но если одна из служб в конечном итоге не справится со своей задачей и создаст блокировку, затрагивающую другие службы, которые запрашивают ту же таблицу, произойдет взаимоблокировка