Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как блокировать записи на уровне строк на редактирование?  [new]
CSD
Member

Откуда:
Сообщений: 121
Перешел к SQL Server от FoxPro. Там была такая возможность как блокировка записей на уровне строк. Прочитал (внимательно!) про блокировки в SQL Server. Никак не пойму, почему в SQL Server нельзя ни под одним ISOLATION LEVEL заблокировать несколько строк на редактирование. Дело в том что между началом и концом транзакции может пройти неопределенное количество времени (к примеру пользователь редактирует существующий документ). То есть используется:
BEGIN TRAN
SELECT ... FROM ... WITH (UPDLOCK) WHERE ... или UPDATE ... SET ... WHERE ...
и когда-то
COMMIT
По идее, должны блокироваться только те записи, попадающие под условие where, но вместо этого он блокирует целые страницы (sp_lock это ясно показывает). Причем вставить записи он дает (под соответствующим ISOLATION LEVEL). Никакие, кстати, системные процедуры (типа sp_indexoption) не помогают.

Помогите, пожалуйста, горю, морду бьют.
10 фев 03, 20:20    [125937]     Ответить | Цитировать Сообщить модератору
 Re: Как блокировать записи на уровне строк на редактирование?  [new]
Mike Evteev
Member

Откуда:
Сообщений: 573
INHO тебе еще про индексы почитать нужно...
И вообще так не делается для client-server, ибо сервер управляет блокировками.
10 фев 03, 20:25    [125939]     Ответить | Цитировать Сообщить модератору
 Re: Как блокировать записи на уровне строк на редактирование?  [new]
cvasil
Member

Откуда:
Сообщений: 519
Используйте (в зависимости от задачи) либо хинт ROWLOCK, либо оптимистическую блокировку, либо делайте свой механизм с флагами.
10 фев 03, 20:35    [125942]     Ответить | Цитировать Сообщить модератору
 Re: Как блокировать записи на уровне строк на редактирование?  [new]
CSD
Member

Откуда:
Сообщений: 121
INHO тебе еще про индексы почитать нужно...
И вообще так не делается для client-server, ибо сервер управляет блокировками

А как делается-то?
10 фев 03, 20:35    [125943]     Ответить | Цитировать Сообщить модератору
 Re: Как блокировать записи на уровне строк на редактирование?  [new]
CSD
Member

Откуда:
Сообщений: 121
Используйте (в зависимости от задачи) либо хинт ROWLOCK, либо оптимистическую блокировку, либо делайте свой механизм с флагами.

Хинт ROWLOCK не помогает, проверял.
10 фев 03, 20:37    [125944]     Ответить | Цитировать Сообщить модератору
 Re: Как блокировать записи на уровне строк на редактирование?  [new]
Mike Evteev
Member

Откуда:
Сообщений: 573
Заведи поле timestamp. Оно обновляется автоматом. Вот и вся оптимистическая блокировка. Если поле изменилось, говоришь об этом юзеру.

Что касается индексов, так у тебя должен быть PK, чтобы записи блокировались, и еще поведение от версии сервера зависит. Не помню, но на 6.5 что-то надо было включать, выше все автоматом должно быть вытавлено.
10 фев 03, 20:43    [125945]     Ответить | Цитировать Сообщить модератору
 Re: Как блокировать записи на уровне строк на редактирование?  [new]
Mike Evteev
Member

Откуда:
Сообщений: 573
by the way, на чем пишешь?
10 фев 03, 20:48    [125946]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить