Обновление без блокировки внутри транзакции - PullRequest
4 голосов
/ 24 ноября 2008

Возможен ли следующий сценарий в SQL Server с использованием одного активного соединения?

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

Ответы [ 2 ]

1 голос
/ 25 ноября 2008

Вы не можете не блокировать таблицу во время записи.

Вы имеете в виду, что хотите записать в таблицу, но затем сохранить монопольную блокировку , а не до фиксации / отката?

Если это так, поместите нужные значения в табличную переменную (на которую не влияет откат / принятие) и отложите запись после основной транзакции. Затем выполните одно обновление, чтобы передать значение из табличной переменной.

Редактировать: Обход SQL 2008 , с другими идеями позже

1 голос
/ 24 ноября 2008

Вы не можете выполнить Обновление, не устанавливая блокировки на столе. Это позволяет уровню изоляции транзакций ДРУГИХ транзакций контролировать, могут ли они «видеть» изменения, внесенные в обновление. Вы можете изменить уровень изоляции транзакции для обновления, но это влияет только на сеанс обновления (где вы его установили), контролируя, может ли обновление «видеть» изменения, сделанные в других сеансах ...

Если вы хотите, чтобы другие операторы Sql могли видеть, что вы делаете в этом обновлении, как если бы оно не было заблокировано, вы должны изменить уровень изоляции транзакции на этих других txs на Read Uncommited. (Осторожно ... Этот уровень изоляции может допускать многочисленные несоответствия в вашей базе данных.)

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