SQL SERVER, exclusive lock on table

User avatar
Homa Brut
Уже с Приветом
Posts: 859
Joined: 14 Sep 2016 21:33
Location: Illinois

SQL SERVER, exclusive lock on table

Post by Homa Brut »

Всем здоровья.

У меня есть процедура, которая должна прочитать максимальное заначение в поле, и сделать новую запись с этим значением + 1. Не хотелось бы, чтоб в одно время несколько пользователей вызвали эту процедуру и прочитали одно и тоже. Вроде надо использовать exclusive lock. Подскажите прав ли я. Если можно с простеньким примером , как его использовать.
Заранее спасибо.
Да и фиг с ним с апокалипсисом, просто глядя на то что творится вокруг, оформилось стойкое убеждение что лучше быть живым параноиком, чем мертвым идеалистом, если вдруг что...
User avatar
Helmsman
Уже с Приветом
Posts: 6450
Joined: 15 May 2003 00:04
Location: LA

Re: SQL SERVER, exclusive lock on table

Post by Helmsman »

Для таких дел обычно sequence используется. Не подойдёт?
iDesperado
Уже с Приветом
Posts: 1349
Joined: 28 Nov 2008 17:50

Re: SQL SERVER, exclusive lock on table

Post by iDesperado »

Bobeg
Уже с Приветом
Posts: 1190
Joined: 26 Nov 2021 12:38

Re: SQL SERVER, exclusive lock on table

Post by Bobeg »

Эксклюзив лок на тейбл это очень очень дорого.
Тоторо
Новичок
Posts: 52
Joined: 20 Dec 2021 01:46

Re: SQL SERVER, exclusive lock on table

Post by Тоторо »

Обычно для этой цели используется поле типа integer с auto-increment.
Но для начала надо разобраться для чего вам изначально понадобилось увеличивать поле на 1. Возможно это результат не очень продуманного дизайна.
Andrey Strelnikov
Уже с Приветом
Posts: 608
Joined: 17 Dec 2009 11:27

Re: SQL SERVER, exclusive lock on table

Post by Andrey Strelnikov »

Тоторо wrote: 21 Dec 2021 18:07 Обычно для этой цели используется поле типа integer с auto-increment.
Но для начала надо разобраться для чего вам изначально понадобилось увеличивать поле на 1. Возможно это результат не очень продуманного дизайна.
Ну там могут быть траблы с возвратом значения при параллельной обработке. Есть какие-то механизмы, но вроде не всегда все надежно.
Вообщем-то надо самим генерить guid и его писать. И его же пользовать.
User avatar
VovaK98
Уже с Приветом
Posts: 1830
Joined: 04 Mar 2002 10:01
Location: Tampa

Re: SQL SERVER, exclusive lock on table

Post by VovaK98 »

Homa Brut wrote: 15 Dec 2021 20:18 У меня есть процедура, которая должна прочитать максимальное заначение в поле, и сделать новую запись с этим значением + 1. Не хотелось бы, чтоб в одно время несколько пользователей вызвали эту процедуру и прочитали одно и тоже. Вроде надо использовать exclusive lock. Подскажите прав ли я. Если можно с простеньким примером , как его использовать.
Заранее спасибо.
Ваш вопрос настолько.. мягко говоря, глубокий и всёобъемлющий, что сложно сразу ответить.

Во-первых, лок на таблицу- это при нынешних возможностях SQL сервера и объемах данных = чистый фейспалм.

Во-вторых, вопрос содержит часть ответа, как вверху правильно ответили, есть уже встроенный тип поля - identity (AKA autoincrement), значение которого вычисляется и поддерживается почти на системном уровне. Зачем эмулировать уже существующий системный код высокоуровневым кодом? Для практики??

Тогда ответ- вместо лока на таблицу создайте или реальную, или вот типа временную таблицу для учёта обращений к вашей процедуре. Что-то вроде

Code: Select all

create table ##g_connections (id bigint IDENTITY, username varchar(64));
create nonclustered index idx_connections_id ON ##g_connections ( [id] DESC);
В вашей уже процедуре проверяйте или добавляйте содержимое глобальной таблицы

Code: Select all

select top 1 username from ##g_connections order by id desc;
insert into ##g_connections (username) values ('testuser');
По выходе из процедуры удаляйте запись во временной таблице

Code: Select all

delete top (1) from ##g_connections where username=@username
Это так, навскидку. Есть и другие варианты.
Несите чушь бережно, стараясь не расплескать. Чушь хороша, когда она полная.
User avatar
Homa Brut
Уже с Приветом
Posts: 859
Joined: 14 Sep 2016 21:33
Location: Illinois

Re: SQL SERVER, exclusive lock on table

Post by Homa Brut »

Thanks. I will take look on what you wrote.
Да и фиг с ним с апокалипсисом, просто глядя на то что творится вокруг, оформилось стойкое убеждение что лучше быть живым параноиком, чем мертвым идеалистом, если вдруг что...
iDesperado
Уже с Приветом
Posts: 1349
Joined: 28 Nov 2008 17:50

Re: SQL SERVER, exclusive lock on table

Post by iDesperado »

Andrey Strelnikov wrote: 23 Dec 2021 14:43
Ну там могут быть траблы с возвратом значения при параллельной обработке. Есть какие-то механизмы, но вроде не всегда все надежно.
это бред.
VovaK98 wrote: 23 Dec 2021 18:18
Тогда ответ- вместо лока на таблицу создайте или реальную, или вот типа временную таблицу для учёта обращений к вашей процедуре. Что-то вроде
не надо такое советовать, его же побьют, если взрослые увидят
autoincrement, в новых мсскл вроде sequence еще сделали.
Andrey Strelnikov
Уже с Приветом
Posts: 608
Joined: 17 Dec 2009 11:27

Re: SQL SERVER, exclusive lock on table

Post by Andrey Strelnikov »

iDesperado wrote: 24 Dec 2021 13:01
Andrey Strelnikov wrote: 23 Dec 2021 14:43
Ну там могут быть траблы с возвратом значения при параллельной обработке. Есть какие-то механизмы, но вроде не всегда все надежно.
это бред.
Неа . Даже при оборачивании в транзакцию при хорошей нагрузке бывали инцеденты с возвратом @@IDENTITY.

В реале такая процедура много затаскивает в таблицы( не в одну), грузит сервер чем-нибудь . Все это не быстро происходит. Воевать с этим дорого.

В свое время решили просто guid формировать на клиенте и его хранить.
Правда это было еще лет пятнадцать назад.
User avatar
VovaK98
Уже с Приветом
Posts: 1830
Joined: 04 Mar 2002 10:01
Location: Tampa

Re: SQL SERVER, exclusive lock on table

Post by VovaK98 »

iDesperado wrote: 24 Dec 2021 13:01 не надо такое советовать, его же побьют, если взрослые увидят
autoincrement, в новых мсскл вроде sequence еще сделали.
Да ладно, всё лучче, чем лок на всю таблицу. Ну пусть тогда триггер пишет.
Несите чушь бережно, стараясь не расплескать. Чушь хороша, когда она полная.
User avatar
liamkin
Уже с Приветом
Posts: 2648
Joined: 19 Jun 2003 20:22
Location: USA

Re: SQL SERVER, exclusive lock on table

Post by liamkin »

Homa Brut wrote: 15 Dec 2021 20:18 Всем здоровья.

У меня есть процедура, которая должна прочитать максимальное заначение в поле, и сделать новую запись с этим значением + 1. Не хотелось бы, чтоб в одно время несколько пользователей вызвали эту процедуру и прочитали одно и тоже. Вроде надо использовать exclusive lock. Подскажите прав ли я. Если можно с простеньким примером , как его использовать.
Заранее спасибо.
Из вашего вопроса непонятно - нужно найти Select max(pole) from Table ?
И затем прибавить 1 и куда-то записать?
Тогда лучше всего подойдет Sequence. Блокировать всю таблицу - очень медленно и поэтому неправильно.

Или в одну строчку таблицы обновить - UPDATE table SET pole=pole+1 WHERE row=myrow ?
В этом случае вам поможет hint WITH ROWLOCK - https://docs.microsoft.com/en-us/sql/t- ... rver-ver15
Будет блокироваться только ваша строчка таблицы, а не вся таблица.
User avatar
Homa Brut
Уже с Приветом
Posts: 859
Joined: 14 Sep 2016 21:33
Location: Illinois

Re: SQL SERVER, exclusive lock on table

Post by Homa Brut »

liamkin wrote: 28 Dec 2021 21:07
Homa Brut wrote: 15 Dec 2021 20:18 Всем здоровья.

У меня есть процедура, которая должна прочитать максимальное заначение в поле, и сделать новую запись с этим значением + 1. Не хотелось бы, чтоб в одно время несколько пользователей вызвали эту процедуру и прочитали одно и тоже. Вроде надо использовать ехцлусиве лоцк. Подскажите прав ли я. Если можно с простеньким примером , как его использовать.
Заранее спасибо.
Из вашего вопроса непонятно - нужно найти Селецт мах(поле) фром Табле ?
И затем прибавить 1 и куда-то записать?
Тогда лучше всего подойдет Сэуенце. Блокировать всю таблицу - очень медленно и поэтому неправильно.

Или в одну строчку таблицы обновить - УПДАТЕ табле СЕТ поле=поле+1 ШХЕРЕ рош=мырош ?
В этом случае вам поможет хинт ШИТХ РОШЛОЦК - хттпс://дощ.мицрософт.цом/ен-ус/съл/т-съл/ъуериес/хинтс-трансацт-съл-табле?виеш=съл-сервер-вер15
Будет блокироваться только ваша строчка таблицы, а не вся таблица.
Мне как раз нужно было всю таблицу. Но вопрос решил локером в шарп коде.
Да и фиг с ним с апокалипсисом, просто глядя на то что творится вокруг, оформилось стойкое убеждение что лучше быть живым параноиком, чем мертвым идеалистом, если вдруг что...
Andrey Strelnikov
Уже с Приветом
Posts: 608
Joined: 17 Dec 2009 11:27

Re: SQL SERVER, exclusive lock on table

Post by Andrey Strelnikov »

Homa Brut wrote: 28 Dec 2021 22:46 Мне как раз нужно было всю таблицу. Но вопрос решил локером в шарп коде.
Ага - аналогично на текущей работе делается. Вообще шарп достаточно производителен, распаралелен и БД ему нужна чтобы хранить.
Ничего интересного не надо в ней делать.
А вообще ID типа integer (и к тому же инкрементные) удобны только в начале жизненного цикла приложения. Относительно простого.
User avatar
KVA
Уже с Приветом
Posts: 5347
Joined: 03 Feb 1999 10:01
Location: NJ, USA

Re: SQL SERVER, exclusive lock on table

Post by KVA »

Andrey Strelnikov wrote: 29 Dec 2021 14:56 А вообще ID типа integer (и к тому же инкрементные) удобны только в начале жизненного цикла приложения. Относительно простого.
А почему это? И что не так с инкрементными ID типа integer?

Return to “Вопросы и новости IT”