SQL SERVER, exclusive lock on table
-
- Уже с Приветом
- Posts: 851
- Joined: 14 Sep 2016 21:33
- Location: Illinois
SQL SERVER, exclusive lock on table
Всем здоровья.
У меня есть процедура, которая должна прочитать максимальное заначение в поле, и сделать новую запись с этим значением + 1. Не хотелось бы, чтоб в одно время несколько пользователей вызвали эту процедуру и прочитали одно и тоже. Вроде надо использовать exclusive lock. Подскажите прав ли я. Если можно с простеньким примером , как его использовать.
Заранее спасибо.
У меня есть процедура, которая должна прочитать максимальное заначение в поле, и сделать новую запись с этим значением + 1. Не хотелось бы, чтоб в одно время несколько пользователей вызвали эту процедуру и прочитали одно и тоже. Вроде надо использовать exclusive lock. Подскажите прав ли я. Если можно с простеньким примером , как его использовать.
Заранее спасибо.
Да и фиг с ним с апокалипсисом, просто глядя на то что творится вокруг, оформилось стойкое убеждение что лучше быть живым параноиком, чем мертвым идеалистом, если вдруг что...
-
- Уже с Приветом
- Posts: 6435
- Joined: 15 May 2003 00:04
- Location: LA
Re: SQL SERVER, exclusive lock on table
Для таких дел обычно sequence используется. Не подойдёт?
-
- Уже с Приветом
- Posts: 1349
- Joined: 28 Nov 2008 17:50
-
- Уже с Приветом
- Posts: 1190
- Joined: 26 Nov 2021 12:38
Re: SQL SERVER, exclusive lock on table
Эксклюзив лок на тейбл это очень очень дорого.
-
- Новичок
- Posts: 52
- Joined: 20 Dec 2021 01:46
Re: SQL SERVER, exclusive lock on table
Обычно для этой цели используется поле типа integer с auto-increment.
Но для начала надо разобраться для чего вам изначально понадобилось увеличивать поле на 1. Возможно это результат не очень продуманного дизайна.
Но для начала надо разобраться для чего вам изначально понадобилось увеличивать поле на 1. Возможно это результат не очень продуманного дизайна.
-
- Уже с Приветом
- Posts: 607
- Joined: 17 Dec 2009 11:27
Re: SQL SERVER, exclusive lock on table
Ну там могут быть траблы с возвратом значения при параллельной обработке. Есть какие-то механизмы, но вроде не всегда все надежно.
Вообщем-то надо самим генерить guid и его писать. И его же пользовать.
-
- Уже с Приветом
- Posts: 1828
- 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: 851
- 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
Ну там могут быть траблы с возвратом значения при параллельной обработке. Есть какие-то механизмы, но вроде не всегда все надежно.
не надо такое советовать, его же побьют, если взрослые увидят
autoincrement, в новых мсскл вроде sequence еще сделали.
-
- Уже с Приветом
- Posts: 607
- 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: 1828
- 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: 2603
- 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: 851
- 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: 607
- Joined: 17 Dec 2009 11:27
Re: SQL SERVER, exclusive lock on table
Ага - аналогично на текущей работе делается. Вообще шарп достаточно производителен, распаралелен и БД ему нужна чтобы хранить.
Ничего интересного не надо в ней делать.
А вообще ID типа integer (и к тому же инкрементные) удобны только в начале жизненного цикла приложения. Относительно простого.
-
- Уже с Приветом
- Posts: 5346
- 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 (и к тому же инкрементные) удобны только в начале жизненного цикла приложения. Относительно простого.
-
- Уже с Приветом
- Posts: 607
- Joined: 17 Dec 2009 11:27
Re: SQL SERVER, exclusive lock on table
Ну вот версии у вас появятся. Поле отдельное прийдется таскать всюду.KVA wrote: ↑29 Dec 2021 17:47А почему это? И что не так с инкрементными ID типа integer?Andrey Strelnikov wrote: ↑29 Dec 2021 14:56 А вообще ID типа integer (и к тому же инкрементные) удобны только в начале жизненного цикла приложения. Относительно простого.
Длины поля скорее всего хватит на жизнь приложения - но тоже потенциальная опасность.
Или вдруг прийдется на несколько серверов БД жить. Или просто сливать в централизованную БД. Уже немасштабируемо просто так.
Вообщем не надо из базы выдавать брать ID.
-
- Уже с Приветом
- Posts: 5346
- Joined: 03 Feb 1999 10:01
- Location: NJ, USA
Re: SQL SERVER, exclusive lock on table
А понятно, premature optimization и постоянное беспокойство по жизни.
-
- Уже с Приветом
- Posts: 1349
- Joined: 28 Nov 2008 17:50
Re: SQL SERVER, exclusive lock on table
а как потом какой-нить дата инженер из кафки или из спарка данные будет заливать ? он должен будет свой мутный алгоритм генерации выдумывать или обязан будет пройти квест с поиском того кто такое выдумал?Andrey Strelnikov wrote: ↑29 Dec 2021 18:07 Ну вот версии у вас появятся. Поле отдельное прийдется таскать всюду.
Длины поля скорее всего хватит на жизнь приложения - но тоже потенциальная опасность.
Или вдруг прийдется на несколько серверов БД жить. Или просто сливать в централизованную БД. Уже немасштабируемо просто так.
Вообщем не надо из базы выдавать брать ID.
-
- Уже с Приветом
- Posts: 607
- Joined: 17 Dec 2009 11:27
Re: SQL SERVER, exclusive lock on table
Те прямо в продакшн базу будет лить? Без ETL минимального? Всю команду перед этим расстреляют и сожгут всю документацию на систему?iDesperado wrote: ↑29 Dec 2021 18:52а как потом какой-нить дата инженер из кафки или из спарка данные будет заливать ? он должен будет свой мутный алгоритм генерации выдумывать или обязан будет пройти квест с поиском того кто такое выдумал?Andrey Strelnikov wrote: ↑29 Dec 2021 18:07 Ну вот версии у вас появятся. Поле отдельное прийдется таскать всюду.
Длины поля скорее всего хватит на жизнь приложения - но тоже потенциальная опасность.
Или вдруг прийдется на несколько серверов БД жить. Или просто сливать в централизованную БД. Уже немасштабируемо просто так.
Вообщем не надо из базы выдавать брать ID.
Хотя это только мое мнение и с Вашим я заранее согласен
Но если ваши ID расползутся по куче других систем, то с ними и прийдется жить. Хотя можно все и переписать
-
- Уже с Приветом
- Posts: 1349
- Joined: 28 Nov 2008 17:50
Re: SQL SERVER, exclusive lock on table
не понял вопроса. а на чем по вашему пишутся взрослые ETL ?Andrey Strelnikov wrote: ↑29 Dec 2021 20:00 Те прямо в продакшн базу будет лить? Без ETL минимального? Всю команду перед этим расстреляют и сожгут всю документацию на систему?
Хотя это только мое мнение и с Вашим я заранее согласен
-
- Уже с Приветом
- Posts: 607
- Joined: 17 Dec 2009 11:27
Re: SQL SERVER, exclusive lock on table
Понял. Мы про разные масштабы говорим. Я по простому и по старинке. Как сейчас в толстых корпоративах незнаю. Видимо везьде автоинкремент?iDesperado wrote: ↑29 Dec 2021 20:13не понял вопроса. а на чем по вашему пишутся взрослые ETL ?Andrey Strelnikov wrote: ↑29 Dec 2021 20:00 Те прямо в продакшн базу будет лить? Без ETL минимального? Всю команду перед этим расстреляют и сожгут всю документацию на систему?
Хотя это только мое мнение и с Вашим я заранее согласен
-
- Уже с Приветом
- Posts: 6435
- Joined: 15 May 2003 00:04
- Location: LA
Re: SQL SERVER, exclusive lock on table
Где как, очевидно. У нас в одних таблицах sequence, в других max(id) + 1 (обычно secondary id). Разве что oracle вместо sql server, но тут однохренственно.
-
- Уже с Приветом
- Posts: 5346
- Joined: 03 Feb 1999 10:01
- Location: NJ, USA
Re: SQL SERVER, exclusive lock on table
Ну а если серьезно по масштабному мыслить.
Вот есть несколько полей определяющих bank account:
Bank Name
Account Number
Account Type
Account Code
и т.д.
Как например без AccountID передавать это все в другие системы? Что по-вашему будет уникально определять bank account? Как эта другая система определит что пришел новый или обновился существующий? Только не говорите мне что комбинация всех этих (или нескольких) полей будет ключём. Меняется _все_ ... со временем.
Вот есть несколько полей определяющих bank account:
Bank Name
Account Number
Account Type
Account Code
и т.д.
Как например без AccountID передавать это все в другие системы? Что по-вашему будет уникально определять bank account? Как эта другая система определит что пришел новый или обновился существующий? Только не говорите мне что комбинация всех этих (или нескольких) полей будет ключём. Меняется _все_ ... со временем.
-
- Уже с Приветом
- Posts: 607
- Joined: 17 Dec 2009 11:27
Re: SQL SERVER, exclusive lock on table
AccountID будет autoincrement или сложносочиненным long(big)integer в этом случае?KVA wrote: ↑29 Dec 2021 23:06 Ну а если серьезно по масштабному мыслить.
Вот есть несколько полей определяющих bank account:
Bank Name
Account Number
Account Type
Account Code
и т.д.
Как например без AccountID передавать это все в другие системы? Что по-вашему будет уникально определять bank account? Как эта другая система определит что пришел новый или обновился существующий? Только не говорите мне что комбинация всех этих (или нескольких) полей будет ключём. Меняется _все_ ... со временем.
-
- Уже с Приветом
- Posts: 5346
- Joined: 03 Feb 1999 10:01
- Location: NJ, USA
Re: SQL SERVER, exclusive lock on table
А чем разница когда AccountID уже попал в базу? Ну допустим мы может рассмотреть оба случая.