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

Откуда:
Сообщений: 661
привет
одна таблица - несколько клиентов

клиент делает так
select top 1 id from table where id<1000
update table set id=9999 where id=xxx

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

что то типа begintransaction но чтобы пока она выполнялась никто не мог читать из таблицы
3 окт 12, 23:59    [13264829]     Ответить | Цитировать Сообщить модератору
 Re: можно ли залочить таблицу на чтение?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32169
Alexander_fx
задача сделать так чтобы разные клиенты не схватили одновременно одну и туже запись
можно ли заблокировать таблицу на время выполнения команды
Можно, см. хинты блокировок, типа holdlock

Ещё можно делать выбор записи в самом update, без отдельного запроса.
4 окт 12, 00:02    [13264835]     Ответить | Цитировать Сообщить модератору
 Re: можно ли залочить таблицу на чтение?  [new]
Alexander_fx
Member

Откуда:
Сообщений: 661
что то с holdlock другие клиенты спокойно читают таблицу
сделал транзакцию - в середине паузу на 10 сек - так эти 10 сек другие клиенты читают таблицу а надо сделать чтобы не могли
можно так?
4 окт 12, 01:07    [13264970]     Ответить | Цитировать Сообщить модератору
 Re: можно ли залочить таблицу на чтение?  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
Alexander_fx,

Внятно задачу можно объяснить?
Чего пытаетесь добиться -- чтобы между чтением и модификацией записи ее никто другой не мог изменить?
Или нужно, на время работы с записью, запретить для других ее чтение? Или еще что-нибудь?
4 окт 12, 01:18    [13264999]     Ответить | Цитировать Сообщить модератору
 Re: можно ли залочить таблицу на чтение?  [new]
нязнайка
Guest
Похоже вам подойдет такой апдейт (если допустимо, что каждая транзакция будет новый незаблокированный id получать ) :

UPDATE t
SET t.id = 9999
FROM 
        (
          SELECT 
                      TOP(1) t.id
          FROM dbo.table AS t WITH(XLOCK, READPAST)
          WHERE t.id < 1000
       ) AS t 
4 окт 12, 01:19    [13265000]     Ответить | Цитировать Сообщить модератору
 Re: можно ли залочить таблицу на чтение?  [new]
нязнайка
Guest
Само собой некластерный индекс по id нужен.
4 окт 12, 01:21    [13265005]     Ответить | Цитировать Сообщить модератору
 Re: можно ли залочить таблицу на чтение?  [new]
Alexander_fx
Member

Откуда:
Сообщений: 661
invm
Alexander_fx,

Внятно задачу можно объяснить?
Чего пытаетесь добиться -- чтобы между чтением и модификацией записи ее никто другой не мог изменить?
Или нужно, на время работы с записью, запретить для других ее чтение? Или еще что-нибудь?


хочу чтобы пока один клиент прочитал таблицу и не отпустил - другой клиент не мог эту таблицу прочитать
4 окт 12, 01:24    [13265014]     Ответить | Цитировать Сообщить модератору
 Re: можно ли залочить таблицу на чтение?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6727
TabLock чтоле?
Для этого не обязательно блокировать саму таблицу, можно и AppLock.
Только нахрена это надо?
4 окт 12, 01:39    [13265032]     Ответить | Цитировать Сообщить модератору
 Re: можно ли залочить таблицу на чтение?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Alexander_fx
invm
Alexander_fx,

Внятно задачу можно объяснить?
Чего пытаетесь добиться -- чтобы между чтением и модификацией записи ее никто другой не мог изменить?
Или нужно, на время работы с записью, запретить для других ее чтение? Или еще что-нибудь?

хочу чтобы пока один клиент прочитал таблицу и не отпустил - другой клиент не мог эту таблицу прочитать
Этому клиенту что вся таблица нужна? вы там наблокируете, что будет как вот тут
4 окт 12, 03:41    [13265117]     Ответить | Цитировать Сообщить модератору
 Re: можно ли залочить таблицу на чтение?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
нязнайка
Похоже вам подойдет такой апдейт (если допустимо, что каждая транзакция будет новый незаблокированный id получать ) :

UPDATE t
SET t.id = 9999
FROM 
        (
          SELECT 
                      TOP(1) t.id
          FROM dbo.table AS t WITH(XLOCK, READPAST)
          WHERE t.id < 1000
       ) AS t 

а так не тоже самое?
UPDATE TOP (1) t WITH(XLOCK, READPAST)
SET t.id = 9999
WHERE t.id < 1000
4 окт 12, 03:43    [13265118]     Ответить | Цитировать Сообщить модератору
 Re: можно ли залочить таблицу на чтение?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32169
Alexander_fx
что то с holdlock другие клиенты спокойно читают таблицу
сделал транзакцию - в середине паузу на 10 сек - так эти 10 сек другие клиенты читают таблицу а надо сделать чтобы не могли
можно так?
Читают ту же запись или другие записи? Нужно то что? Запостите ваш код, напишите, что хотелось получить, и что получается.

И насчёт holdlock - может и другие нужно, я просто сказал, про что вам прочитать.
4 окт 12, 08:09    [13265244]     Ответить | Цитировать Сообщить модератору
 Re: можно ли залочить таблицу на чтение?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6727
Вот была похожая ветка: 12878522 Точно с таким же смыслом.

Нельзя в транзакции сначала строку читать, а потом её менять, надо сразу указывать что вы с ней собираетесь делать.
Поэтому самое лучшее для RC (Read Committed) это стараться всё уместить в одну команду.

Mind
UPDATE TOP (1) t WITH(XLOCK, READPAST)
SET t.id = 9999
WHERE t.id < 1000
XLock бессмыслен. Любое изменение априори накладывает XLock.
Во вторых, если все клиенты делают ID = 9999 и ID уникальный, то это палюбэ выстраивание в очередь. ReadPast тут практически бессмыслен.
4 окт 12, 10:34    [13265864]     Ответить | Цитировать Сообщить модератору
 Re: можно ли залочить таблицу на чтение?  [new]
super-code
Member

Откуда:
Сообщений: 244
http://msdn.microsoft.com/ru-ru/library/ms187373.aspx
Вам нужно начать транзакцию, запросить данные с tablock + xlock, потом после измененний принять транзакцию. При чтении из других коннектов не использоват nolock, а установить соответствующий уровень транзакции.
4 окт 12, 10:55    [13265998]     Ответить | Цитировать Сообщить модератору
 Re: можно ли залочить таблицу на чтение?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6727
super-code, хинты не нужны. Показанный код выше об этом говорит.
Читайте топик внимательнее.
4 окт 12, 15:07    [13268316]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить