Тупик: вставка против выбора из нескольких таблиц. Снимок изоляции? - PullRequest
2 голосов
/ 17 июня 2011

В моей базе данных есть две тесно связанные таблицы.Существует часто называемый SP, который вставляет некоторые строки в обе таблицы в транзакции, и несколько других мест, в которых соединяются SELECT из этих таблиц.

INSERT принимают X-блокировки для обеих таблиц, SELECT принимают S или IS-блокировкиих.Поскольку порядок, в котором принимаются общие блокировки, варьируется от запроса к запросу, некоторые из них иногда оказываются заблокированными с помощью транзакции INSERT.

Есть ли хороший способ избежать этих взаимных блокировок (NOLOCK, вероятно, не квалифицируется как 'хорошо ')?

Пока что единственное общее решение, которое я могу придумать, это использование уровня изоляции SNAPSHOT.Тем не менее, это добавило бы некоторую потерю производительности, и я пока не нашел звуковых данных о том, насколько велика эта нагрузка.

Ответы [ 3 ]

0 голосов
/ 17 июня 2011

Я использую снимок в моей системе. Это не бесплатно, это точно, но альтернативы тоже не бесплатны - блокировка также потребляет ресурсы. Использование rowlock не всегда помогает. Также снимок дает вам согласованный моментальный снимок ваших данных; в противном случае вы можете столкнуться с некоторыми тонкими ошибками.

Еще одна вещь: вы можете получить взаимоблокировки, даже если у вас есть только одна таблица, примеры здесь: Воспроизведение взаимоблокировок, включающих только одну таблицу

0 голосов
/ 17 июня 2011

Ваш SP выбирает или обновляет что-либо из этих таблиц внутри транзакции? Если нет, вы можете попытаться использовать подсказки rowlock для вставок и других элементов выбора (блокировки строк обычно не перерастают в блокировки страниц или таблиц, если у вас не слишком много строк в результатах выбора). Если да, то вы можете попробовать updlock подсказку для ваших выборов внутри транзакции SP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...