Исключение блокировки таблицы против блокировки таблицы ожидает завершения

В настоящее время мне интересно, почему иногда ADO.NET генерирует непосредственно исключение блокировки таблицы, когда таблица заблокирована и несколько раз выполняемые операторы ждут, пока таблица больше не будет заблокирована. Когда блокировка таблицы вызывает исключение, а когда нет? К сожалению, у меня нет кода для воспроизведения обеих ситуаций.

Есть ли какое-то правило в Sybase SQL где-нибудь, которые указывают это поведение?

Спасибо вам всем!

1 ответ

Sybase и MsSql используют одну и ту же базу исторического кода. Назад в старые времена (до sql 2000) и Sybase той же эпохи. Ни один из поставщиков не решил свои проблемы с блокировкой. Каждый мог попасть в тупиковую ситуацию. Проблема заключалась в логике, которую они использовали. Представьте себе мертвую блокировку, например, за рулем машины на 4 остановках. Представьте себе, если в правилах говорится, что уступают право, когда две записи (машины) появляются одновременно. Это прекрасно работает, за исключением ситуаций, когда одновременно прибывают 4 машины, каждая из которых пытается уступить автомобилю справа. Вы попадаете в тупиковую ситуацию. Еще в тот день администратор БД должен был выбрать запись, чтобы убить эту транзакцию (блокируя ее завершение), чтобы разрешить очистку тупика. Позже MsSql реализовал логику, где он автоматически выбирает запись, которую нужно уничтожить. Они также улучшили свою логику блокировки, так что в будущих версиях взаимные блокировки гораздо реже. Так что иногда это работает, а иногда это не работает, обусловлено тем, была ли ваша запись той, которая была выбрана для удаления, или другие мертвые блокировки закончили работу, позволив вашей записи быть обработанной.

Oracle лучше блокирует логику. Они хранят несколько копий данного поля в зависимости от того, изменяют ли его несколько процессов одновременно. Когда вы делаете выбор, вы получаете записи, которые уже были зафиксированы и не выполняются долго незавершенные процессы, на которых схема блокировки Sybase/MsSql ожидает завершения. Более поздние версии MsSql работают намного лучше, чем Sql 7 и sql 2000, где это была большая проблема. Sybase, возможно, претерпела те же улучшения.

Есть способы уменьшить эту проблему блокировки, разбивая большую таблицу на меньшие таблицы и обновляя от маленькой таблицы к большей таблице в пакетном режиме. Думайте об этом как о левом и правом столе. Когда вы делаете большой объем вставки в активную левую таблицу, правая таблица вставляется в основную таблицу. Затем вы переключаетесь и делаете большие объемы вставок в правую таблицу, в то время как левая таблица перемещается в основную таблицу. Это разбивает транзакции между таблицами и уменьшает вероятность одновременного попадания нескольких процессов в одну и ту же таблицу (уменьшая взаимные блокировки). Но это означает, что у вас нет самых последних данных, так как вы не полностью обработали записи в левой и правой таблицах.

Другие вопросы по тегам