Нужно сделать монопольную блокировку на читаемую стороку

Владимир
Дата: 13.02.2001 17:25:31
А именно я выбираю из таблицы MyTable строку, в которой в дальнейшем хочу изменить параметры.
Но при этом мне надо чтоб эту строку никто не смог нипрочесть, не темболее изменить, а другие строки не попавшие в данный запрос были открыты.
Мои сооброжения следующие:

begin tran up_my_row
select
column1
from MyTable -- здесь (по моему) должна стаять блокировка, но какая вот в чем вопрос?
where
column2 = 234

/* операторы */

update MyTable
set
column1 = column1 + 10
where
column2 = 234
commit tran up_my_row

Если есть еще какие возможные решения данной задачи, то я с большим удовольствием прочту.

С уважением.
VadimB
Дата: 13.02.2001 19:45:01
перед транзакцией надо поставить:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SergSuper
Дата: 14.02.2001 10:06:08
недели 2 назад эта тема тут активно обсуждалась

основное мнение было - такие блокировки надо делать самому: вести таблицы блокировок, писать триггеры, процедуры и т.д.
Владимир
Дата: 14.02.2001 12:25:44
Если изменять уровень изоляции до указанного, то получается следующее:
если в один момент к записи обратяться два пользователя, то первый отработает как надо, а второй отвалиться из-за конфликта (что собственно я пытаюсь избежать).
Со вторым случаем тоже непонятно как я смогу заблокировать запись с помощью таблицы блокировок, писать триггеры, процедуры и т.д., если по прежнему пользователи могут использовать запись одновременно?
Ведь к таблице блокировок также могут обратиться два пользователя и попытаться наложить на запись свои прова одновременно.
Как быть при таком раскладе?

P.S. Если место где написанно "-- здесь (по моему) должна стаять блокировка, но какая вот в чем вопрос?" заменить на "(TABLOCKX)",
то все работает замечательно первый пользователь обрабатываеться,а второй стоит в очереди и никто при этом не отваливаеться, но есть одно "но" - блакируеться вся таблица, а надо только обрабатываемую запись.
VadimB
Дата: 14.02.2001 13:09:50
а пробовал from MyTable ROWLOCK
Oleg F
Дата: 14.02.2001 13:42:22
UPDLOCK
SergSuper
Дата: 14.02.2001 14:03:37
Насчет второго случая:

а вот таблицу блокировок надо апдейтить с ключом "(TABLOCKX)", она должна быть небольшая, это будет происходить быстро
Владимир
Дата: 14.02.2001 17:13:36
Я думаю что UPDLOCK и ROWLOCK всетаки не для моего случая.
ROWLOCK начинает действовать с уровня изоляции REPEATABLE READ, но тогда кто-то из двух отвалиться (почему-то первый запрасивший запись).
UPDLOCK накладывает блокировку на UPDATE, а мне надо и на SELECT.
TABLOCKX приемлемый вариант (если таблица небольшая) - я так пока все и сделал.

Всем спасибо за участие в решение моей проблемы.

Удачи.