Вопрос по блокировке таблицы

ROLpogo
Дата: 28.01.2009 17:38:53
Проблема в следующем:

К базе на SQLServer 2000 одновременно обращаются несколько пользователей. Они запускают сохранённую процедуру, которая сначала читает, а затем модифицирует данные в одной из строк таблицы Config. Нужно чтобы во время обращения одного пользователя к таблице Config она блокировалась на чтение и запись для остальных пользователей.

Вот как я это сделал в теле сохранённой процедуры:

-- Блокируем табл Config
set implicit_transactions on
begin tran select * from Config with (TABLOCKX)

  declare
    @LastBarCode int,
    @Prefix VarChar(3)

  select
    @LastBarCode = d_iNum,
    @Prefix = d_string
  from Config
  where Name = 'LastBarCode'

  update Config set d_iNum = @LastBarCode + 5 where Name = 'LastBarCode'
-- Освобождаем табл Config
commit
commit
set implicit_transactions off

Сделал тестовый прогон в котором с двух разных сессий по 5000 раз шло одновременное обращение к этой процедуре. В итоге все сработало верно, но в боевом режиме выявилось, что такой алгоритм работает не стабильно.
Вопрос: Где может быть ошибка? Или как можно по другому в данном случае ограничить доступ к таблице?
AnarAlizadeh
Дата: 28.01.2009 17:47:03
А если блокануть только строку? Не лучше было бы?
iap
Дата: 28.01.2009 17:47:28
1. Зачем режим неявной транзакции?
2. Почему через переменные? UPDATE ... FROM ... Config WITH(хинты) не проще?
ROLpogo
Дата: 28.01.2009 18:02:45
AnarAlizadeh
А если блокануть только строку? Не лучше было бы?


Лучше, но я не нашёл как это можно сделать

iap
1. Зачем режим неявной транзакции?
2. Почему через переменные? UPDATE ... FROM ... Config WITH(хинты) не проще?


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

Я в этом деле ещё новичёк. Можно пример, как в моем случае можно заблокировать в режиме явной транзакции или через хинты на апдейт?
AnarAlizadeh
Дата: 28.01.2009 18:09:57
Таблицы - (TABLOCKX) вообще убери


А На АПДЕЙТЕ сделай (ROWLOCK), то есть - таблица будет читатся - КРОМЕ той (тех) строки, которая АПДЕЙТИТСЯ на данный момент

а про то что IAP(мудрый) сказал,, наверно объяснит тебе скоро...
AnarAlizadeh
Дата: 28.01.2009 18:11:13
С Таблицы - (TABLOCKX) вообще убери
(Наверху букву пропустил, сорри, смысл то менялся радикально)
Glory
Дата: 28.01.2009 18:14:16
 declare
    @LastBarCode int,
    @Prefix VarChar(3)

set rowcount 1
update Config set @LastBarCode=d_iNum = d_iNum  + 5, @Prefix = d_string
where Name = 'LastBarCode
set rowcount 0
AnarAlizadeh
Дата: 28.01.2009 18:24:01
Glory
 declare
    @LastBarCode int,
    @Prefix VarChar(3)

set rowcount 1
update Config set @LastBarCode=d_iNum = d_iNum  + 5, @Prefix = d_string
where Name = 'LastBarCode
set rowcount 0



Glory,
проверил только что: set rowcount 1.
Это вроде только на одну запись.
А если 1 запросом апдейтится несколько?
Ну а все же ЕСЛИ??? :)
Glory
Дата: 28.01.2009 18:29:55
AnarAlizadeh
Glory
 declare
    @LastBarCode int,
    @Prefix VarChar(3)

set rowcount 1
update Config set @LastBarCode=d_iNum = d_iNum  + 5, @Prefix = d_string
where Name = 'LastBarCode
set rowcount 0



Glory,
проверил только что: set rowcount 1.
Это вроде только на одну запись.
А если 1 запросом апдейтится несколько?
Ну а все же ЕСЛИ??? :)

Об этом автора справшивайте. Мне тоже непонятно, зачем он что-то читает в переменные
Самое логичное предположение, что некие операторы желают на конкурентной основе изменять одну запись, из множества соответстующих каким то критериям. При этом каждый из них должен изменить "свою" запись
AnarAlizadeh
Дата: 28.01.2009 18:38:42
Да, я понимаю конечно, это я для себя уже спрашивал. Спасибо все равно!!!
просто команда set rowcount 1 заинтересовала, юзаю скуль 2005, а об етом не слышал, обычно (ROWCOUNT) использую