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

Откуда:
Сообщений: 3216
Привет!

Решаю нубскую задачу. Клиент читает запись из таблицы сли не находит ее, то добавляет. Как сделать чтобы исключить добавление дублирущей записи из разных процессов? В смысле как сделать правильно? Добавить уникальный составной ключ а в коде ловить исключение? Или как-то на уровне блокировок грамотней будет?
26 сен 16, 15:27    [19709079]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
aleks2
Guest
Т-Миронов
Привет!

Решаю нубскую задачу. Клиент читает запись из таблицы сли не находит ее, то добавляет. Как сделать чтобы исключить добавление дублирущей записи из разных процессов? В смысле как сделать правильно? Добавить уникальный составной ключ а в коде ловить исключение? Или как-то на уровне блокировок грамотней будет?


Если те по-барабану "откуда запись" - включи на уникальном индексе WITH( IGNORE_DUP_KEY = ON ) и будет тебе щастье..
26 сен 16, 15:30    [19709099]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
aleks2,

ну если это от клиента приходит, то лучше сообщать и желательно доступным языком :) реализуется через instead of триггер, но если всем пофиг, то можно и "по тихому" или оставить стандартную ругань sql
26 сен 16, 15:35    [19709122]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
Т-Миронов
Member

Откуда:
Сообщений: 3216
aleks2
Т-Миронов
Привет!

Решаю нубскую задачу. Клиент читает запись из таблицы сли не находит ее, то добавляет. Как сделать чтобы исключить добавление дублирущей записи из разных процессов? В смысле как сделать правильно? Добавить уникальный составной ключ а в коде ловить исключение? Или как-то на уровне блокировок грамотней будет?


Если те по-барабану "откуда запись" - включи на уникальном индексе WITH( IGNORE_DUP_KEY = ON ) и будет тебе щастье..


Нет не по барабану.

У меня есть N агентов получающие задания на обработкус ключом string, int. Каждый агент идет в базу и если не обнаруживает этот ключ должен запретить добавление этого ключа. Ищущие по этому ключу должны ждать. Заблокировавший агент выполняет некоторую продолжительную операцию, после чего заполняет все поля строки и отпускает блокировку.
26 сен 16, 15:35    [19709125]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
добавьте поле-признак, что запись используется, после обработки уберите флаг.
когда выбираете задачу на обратку своим агентом проверяйте этот флаг и если нужно выполнять берёте запись и меняете флаг на "в работе".
26 сен 16, 15:40    [19709162]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Konst_One
добавьте поле-признак, что запись используется, после обработки уберите флаг.
когда выбираете задачу на обратку своим агентом проверяйте этот флаг и если нужно выполнять берёте запись и меняете флаг на "в работе".

при это сильно задумайтесь над ситуацией если агент открыл "код" и выключил компьютер :)
26 сен 16, 15:42    [19709173]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
Т-Миронов
Member

Откуда:
Сообщений: 3216
Konst_One
добавьте поле-признак, что запись используется, после обработки уберите флаг.
когда выбираете задачу на обратку своим агентом проверяйте этот флаг и если нужно выполнять берёте запись и меняете флаг на "в работе".


Ой-ой! За такое в приличной компании переводят на позицию джуниора!
26 сен 16, 15:42    [19709176]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
для этого старые зависшие задания выставляют в статус "ожидает выполнения"
26 сен 16, 15:42    [19709180]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
Т-Миронов
Konst_One
добавьте поле-признак, что запись используется, после обработки уберите флаг.
когда выбираете задачу на обратку своим агентом проверяйте этот флаг и если нужно выполнять берёте запись и меняете флаг на "в работе".


Ой-ой! За такое в приличной компании переводят на позицию джуниора!


не порите чушь, это стандартная практика создания очереди выполнения
26 сен 16, 15:43    [19709189]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
aleks2
Guest
Т-Миронов
aleks2
пропущено...


Если те по-барабану "откуда запись" - включи на уникальном индексе WITH( IGNORE_DUP_KEY = ON ) и будет тебе щастье..


Нет не по барабану.

У меня есть N агентов получающие задания на обработкус ключом string, int. Каждый агент идет в базу и если не обнаруживает этот ключ должен запретить добавление этого ключа. Ищущие по этому ключу должны ждать. Заблокировавший агент выполняет некоторую продолжительную операцию, после чего заполняет все поля строки и отпускает блокировку.


И фсего то?
0. unique(ключ) with ( IGNORE_DUP_KEY = ON )
1. Пущай агент просто вставляет ключ, признак "занято" в дополнительном поле и поле = номер агента.
2. Потом проверяет: чаво вставилось в поле = номер агента? Если номер его - колбасит обработку.
3. А в конце обработки обновляет дополнительное поле на "свободно или как там еще".
26 сен 16, 15:44    [19709191]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
aleks2
Т-Миронов
пропущено...


Нет не по барабану.

У меня есть N агентов получающие задания на обработкус ключом string, int. Каждый агент идет в базу и если не обнаруживает этот ключ должен запретить добавление этого ключа. Ищущие по этому ключу должны ждать. Заблокировавший агент выполняет некоторую продолжительную операцию, после чего заполняет все поля строки и отпускает блокировку.


И фсего то?
0. unique(ключ) with ( IGNORE_DUP_KEY = ON )
1. Пущай агент просто вставляет ключ, признак "занято" в дополнительном поле и поле = номер агента.
2. Потом проверяет: чаво вставилось в поле = номер агента? Если номер его - колбасит обработку.
3. А в конце обработки обновляет дополнительное поле на "свободно или как там еще".


+100
26 сен 16, 15:45    [19709196]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
всех в джуниоры :)
можно статусы держать на таблице с этими самыми кодами которые надо обработать, и при завершении выполнения "ввода" убирать их из таблицы задач, теже яйца только в профиль
26 сен 16, 15:48    [19709212]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
Т-Миронов
Member

Откуда:
Сообщений: 3216
aleks2
Т-Миронов
пропущено...


Нет не по барабану.

У меня есть N агентов получающие задания на обработкус ключом string, int. Каждый агент идет в базу и если не обнаруживает этот ключ должен запретить добавление этого ключа. Ищущие по этому ключу должны ждать. Заблокировавший агент выполняет некоторую продолжительную операцию, после чего заполняет все поля строки и отпускает блокировку.


И фсего то?
0. unique(ключ) with ( IGNORE_DUP_KEY = ON )
1. Пущай агент просто вставляет ключ, признак "занято" в дополнительном поле и поле = номер агента.
2. Потом проверяет: чаво вставилось в поле = номер агента? Если номер его - колбасит обработку.
3. А в конце обработки обновляет дополнительное поле на "свободно или как там еще".


А если агент добавит строчку и упадет? Мне потом ручками базу чистить?
26 сен 16, 15:51    [19709228]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
ну что вы не можете в своей же ХП сначала подчистить зависшие задания по дате?
26 сен 16, 15:52    [19709234]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Т-Миронов,

устанавливаете бизнес процесс и время 30 минут на ввод, после сбрасываете флаг ввода этим агентом, а вставку разрешаете только тому кто надел тапки на данный код
26 сен 16, 15:53    [19709244]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
Т-Миронов
Ой-ой! За такое в приличной компании переводят на позицию джуниора!


А приведите свой вариант решения
26 сен 16, 15:57    [19709271]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
Т-Миронов
Member

Откуда:
Сообщений: 3216
Pavel1211
Т-Миронов
Ой-ой! За такое в приличной компании переводят на позицию джуниора!


А приведите свой вариант решения


Решение пока только ищется.

но вот этот вариант арссматривается как приоритетный.

TaPaK
Т-Миронов,

устанавливаете бизнес процесс и время 30 минут на ввод, после сбрасываете флаг ввода этим агентом, а вставку разрешаете только тому кто надел тапки на данный код


UniqueKey what Timestamp exparaationDate
26 сен 16, 16:15    [19709393]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Т-Миронов
Pavel1211
пропущено...


А приведите свой вариант решения


Решение пока только ищется.

но вот этот вариант арссматривается как приоритетный.

TaPaK
Т-Миронов,

устанавливаете бизнес процесс и время 30 минут на ввод, после сбрасываете флаг ввода этим агентом, а вставку разрешаете только тому кто надел тапки на данный код


UniqueKey what Timestamp exparaationDate

Ой-ой! За такое в приличной компании переводят на позицию джуниора!
26 сен 16, 16:21    [19709424]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Т-Миронов
У меня есть N агентов получающие задания на обработкус ключом string, int. Каждый агент идет в базу и если не обнаруживает этот ключ должен запретить добавление этого ключа. Ищущие по этому ключу должны ждать. Заблокировавший агент выполняет некоторую продолжительную операцию, после чего заполняет все поля строки и отпускает блокировку.
1. Сделать уникальный индекс.
2. Далее примерно так
begin tran;

merge into Таблица t with (serializable)
using (select @Ключ as [key], @Значение1 as f1, ..., @ЗначениеN as fN) s on s.[key] = t.[key]
when not matched then
 insert (...) values (...)

...
--длительная обработка
...

update Таблица ...

commit;

Можно еще посмотреть в сторону sp_getapplock.
26 сен 16, 16:25    [19709447]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка таблицы базы или как правильно?  [new]
Adx
Guest
Технически все сводится к блокировкам - что ключ, что applock.
А вот с архитектурой приложения беда.
26 сен 16, 23:17    [19711357]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить