SQL SERVER, exclusive lock on table
-
- Уже с Приветом
- Posts: 859
- Joined: 14 Sep 2016 21:33
- Location: Illinois
SQL SERVER, exclusive lock on table
Всем здоровья.
У меня есть процедура, которая должна прочитать максимальное заначение в поле, и сделать новую запись с этим значением + 1. Не хотелось бы, чтоб в одно время несколько пользователей вызвали эту процедуру и прочитали одно и тоже. Вроде надо использовать exclusive lock. Подскажите прав ли я. Если можно с простеньким примером , как его использовать.
Заранее спасибо.
У меня есть процедура, которая должна прочитать максимальное заначение в поле, и сделать новую запись с этим значением + 1. Не хотелось бы, чтоб в одно время несколько пользователей вызвали эту процедуру и прочитали одно и тоже. Вроде надо использовать exclusive lock. Подскажите прав ли я. Если можно с простеньким примером , как его использовать.
Заранее спасибо.
Да и фиг с ним с апокалипсисом, просто глядя на то что творится вокруг, оформилось стойкое убеждение что лучше быть живым параноиком, чем мертвым идеалистом, если вдруг что...
-
- Уже с Приветом
- Posts: 6450
- Joined: 15 May 2003 00:04
- Location: LA
-
- Уже с Приветом
- Posts: 1349
- Joined: 28 Nov 2008 17:50
-
- Уже с Приветом
- Posts: 1190
- Joined: 26 Nov 2021 12:38
-
- Новичок
- Posts: 52
- Joined: 20 Dec 2021 01:46
Re: SQL SERVER, exclusive lock on table
Обычно для этой цели используется поле типа integer с auto-increment.
Но для начала надо разобраться для чего вам изначально понадобилось увеличивать поле на 1. Возможно это результат не очень продуманного дизайна.
Но для начала надо разобраться для чего вам изначально понадобилось увеличивать поле на 1. Возможно это результат не очень продуманного дизайна.
-
- Уже с Приветом
- Posts: 608
- Joined: 17 Dec 2009 11:27
Re: SQL SERVER, exclusive lock on table
Ну там могут быть траблы с возвратом значения при параллельной обработке. Есть какие-то механизмы, но вроде не всегда все надежно.Тоторо wrote: 21 Dec 2021 18:07 Обычно для этой цели используется поле типа integer с auto-increment.
Но для начала надо разобраться для чего вам изначально понадобилось увеличивать поле на 1. Возможно это результат не очень продуманного дизайна.
Вообщем-то надо самим генерить guid и его писать. И его же пользовать.
-
- Уже с Приветом
- Posts: 1830
- Joined: 04 Mar 2002 10:01
- Location: Tampa
Re: SQL SERVER, exclusive lock on table
Ваш вопрос настолько.. мягко говоря, глубокий и всёобъемлющий, что сложно сразу ответить.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
Несите чушь бережно, стараясь не расплескать. Чушь хороша, когда она полная.
-
- Уже с Приветом
- Posts: 859
- Joined: 14 Sep 2016 21:33
- Location: Illinois
Re: SQL SERVER, exclusive lock on table
Thanks. I will take look on what you wrote.
Да и фиг с ним с апокалипсисом, просто глядя на то что творится вокруг, оформилось стойкое убеждение что лучше быть живым параноиком, чем мертвым идеалистом, если вдруг что...
-
- Уже с Приветом
- Posts: 1349
- Joined: 28 Nov 2008 17:50
Re: SQL SERVER, exclusive lock on table
это бред.Andrey Strelnikov wrote: 23 Dec 2021 14:43
Ну там могут быть траблы с возвратом значения при параллельной обработке. Есть какие-то механизмы, но вроде не всегда все надежно.
не надо такое советовать, его же побьют, если взрослые увидятVovaK98 wrote: 23 Dec 2021 18:18
Тогда ответ- вместо лока на таблицу создайте или реальную, или вот типа временную таблицу для учёта обращений к вашей процедуре. Что-то вроде
autoincrement, в новых мсскл вроде sequence еще сделали.
-
- Уже с Приветом
- Posts: 608
- Joined: 17 Dec 2009 11:27
Re: SQL SERVER, exclusive lock on table
Неа . Даже при оборачивании в транзакцию при хорошей нагрузке бывали инцеденты с возвратом @@IDENTITY.iDesperado wrote: 24 Dec 2021 13:01это бред.Andrey Strelnikov wrote: 23 Dec 2021 14:43
Ну там могут быть траблы с возвратом значения при параллельной обработке. Есть какие-то механизмы, но вроде не всегда все надежно.
В реале такая процедура много затаскивает в таблицы( не в одну), грузит сервер чем-нибудь . Все это не быстро происходит. Воевать с этим дорого.
В свое время решили просто guid формировать на клиенте и его хранить.
Правда это было еще лет пятнадцать назад.
-
- Уже с Приветом
- Posts: 1830
- Joined: 04 Mar 2002 10:01
- Location: Tampa
Re: SQL SERVER, exclusive lock on table
Да ладно, всё лучче, чем лок на всю таблицу. Ну пусть тогда триггер пишет.iDesperado wrote: 24 Dec 2021 13:01 не надо такое советовать, его же побьют, если взрослые увидят
autoincrement, в новых мсскл вроде sequence еще сделали.
Несите чушь бережно, стараясь не расплескать. Чушь хороша, когда она полная.
-
- Уже с Приветом
- Posts: 2648
- Joined: 19 Jun 2003 20:22
- Location: USA
Re: SQL SERVER, exclusive lock on table
Из вашего вопроса непонятно - нужно найти Select max(pole) from Table ?Homa Brut wrote: 15 Dec 2021 20:18 Всем здоровья.
У меня есть процедура, которая должна прочитать максимальное заначение в поле, и сделать новую запись с этим значением + 1. Не хотелось бы, чтоб в одно время несколько пользователей вызвали эту процедуру и прочитали одно и тоже. Вроде надо использовать exclusive lock. Подскажите прав ли я. Если можно с простеньким примером , как его использовать.
Заранее спасибо.
И затем прибавить 1 и куда-то записать?
Тогда лучше всего подойдет Sequence. Блокировать всю таблицу - очень медленно и поэтому неправильно.
Или в одну строчку таблицы обновить - UPDATE table SET pole=pole+1 WHERE row=myrow ?
В этом случае вам поможет hint WITH ROWLOCK - https://docs.microsoft.com/en-us/sql/t- ... rver-ver15
Будет блокироваться только ваша строчка таблицы, а не вся таблица.
-
- Уже с Приветом
- Posts: 859
- Joined: 14 Sep 2016 21:33
- Location: Illinois
Re: SQL SERVER, exclusive lock on table
Мне как раз нужно было всю таблицу. Но вопрос решил локером в шарп коде.liamkin wrote: 28 Dec 2021 21:07Из вашего вопроса непонятно - нужно найти Селецт мах(поле) фром Табле ?Homa Brut wrote: 15 Dec 2021 20:18 Всем здоровья.
У меня есть процедура, которая должна прочитать максимальное заначение в поле, и сделать новую запись с этим значением + 1. Не хотелось бы, чтоб в одно время несколько пользователей вызвали эту процедуру и прочитали одно и тоже. Вроде надо использовать ехцлусиве лоцк. Подскажите прав ли я. Если можно с простеньким примером , как его использовать.
Заранее спасибо.
И затем прибавить 1 и куда-то записать?
Тогда лучше всего подойдет Сэуенце. Блокировать всю таблицу - очень медленно и поэтому неправильно.
Или в одну строчку таблицы обновить - УПДАТЕ табле СЕТ поле=поле+1 ШХЕРЕ рош=мырош ?
В этом случае вам поможет хинт ШИТХ РОШЛОЦК - хттпс://дощ.мицрософт.цом/ен-ус/съл/т-съл/ъуериес/хинтс-трансацт-съл-табле?виеш=съл-сервер-вер15
Будет блокироваться только ваша строчка таблицы, а не вся таблица.
Да и фиг с ним с апокалипсисом, просто глядя на то что творится вокруг, оформилось стойкое убеждение что лучше быть живым параноиком, чем мертвым идеалистом, если вдруг что...
-
- Уже с Приветом
- Posts: 608
- Joined: 17 Dec 2009 11:27
Re: SQL SERVER, exclusive lock on table
Ага - аналогично на текущей работе делается. Вообще шарп достаточно производителен, распаралелен и БД ему нужна чтобы хранить.Homa Brut wrote: 28 Dec 2021 22:46 Мне как раз нужно было всю таблицу. Но вопрос решил локером в шарп коде.
Ничего интересного не надо в ней делать.
А вообще ID типа integer (и к тому же инкрементные) удобны только в начале жизненного цикла приложения. Относительно простого.
-
- Уже с Приветом
- Posts: 5347
- Joined: 03 Feb 1999 10:01
- Location: NJ, USA
Re: SQL SERVER, exclusive lock on table
А почему это? И что не так с инкрементными ID типа integer?Andrey Strelnikov wrote: 29 Dec 2021 14:56 А вообще ID типа integer (и к тому же инкрементные) удобны только в начале жизненного цикла приложения. Относительно простого.