|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
Есть таблица MS SQL, в которой, среди прочего, есть 1)уникальный идентификатор записи типа bigint 2)поле статуса записи типа int. Приложению нужно взять из таблицы первую попавшуюся запись, у которой статус = 0 и тут же пометить её как прочитанную, поставив статус = 1, чтобы другие (параллельные конкурирующие) процессы не могли взять её повторно. Как это лучше всего сделать, если MS SQL - 2017-й? Решение, успешно работавшее какое-то время, стало порождать блокировки "на ровном месте", и поэтому пока не приводится. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 17:44 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 18:09 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
AR® Как это лучше всего сделать Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2021, 18:23 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
Спасибо за ответы. Вопросы. 1. Какой уровень изоляции транзакций подразумевается? Сейчас там Serializable (по причинам, которые уже никто не вспомнит). 2. Хинты реально нужны? Сейчас так: with(UPDLOCK, ROWLOCK) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 09:45 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
AR® Какой уровень изоляции транзакций подразумевается? AR® Хинты реально нужны? Readpast нужен, чтобы конкурирующие сеансы не выстраивались в очередь. Rowlock желателен, чтобы автоматом не выбралась гранулярность блокировок уровня страницы или таблицы ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 10:48 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
invm Будет правильно работать даже на RUC. А при serializable нельзя использовать readpast... В порядке пути к совершенству: можно ли как-то ввести сортировку, чтобы выбирался минимальный идентификатор со статусом = 0 ? Написать with (rowlock, readpast, index(подходящийИндекс)) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 11:32 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
AR®, при serializable вы всегда получите очередь ожиданий при случайном выборе. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 11:46 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
AR® А при serializable нельзя использовать readpast... Если же выполняется в рамках другой задачи, где нужен serializable, добавьте еще хинт readcommittedlock. AR® можно ли как-то ввести сортировку, чтобы выбирался минимальный идентификатор со статусом = 0 ? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 11:54 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
Владислав Колосов при serializable вы всегда получите очередь ожиданий при случайном выборе. Возможно, именно это и имеет место. Но вот что интересно, на более ранних MS SQL (по крайней мере 2008) этого не наблюдалось. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 12:02 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
invm Можно. Но для данной задачи serializable избыточен. Сам не пробовал, но судя по документации - нельзя https://docs.microsoft.com/ru-ru/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-ver15 Аргумент READPAST можно указывать только в транзакциях, выполняемых на уровнях изоляции READ COMMITTED или REPEATABLE READ. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 12:05 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
invm Можно Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Очень близкое к этому используется и приводит к ожиданиям deadlock... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 12:08 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
msLex Сам не пробовал, но судя по документации - нельзя Пробовал, ошибка. А добавлять внутри "понижающий" readcommittedlock не хочу, т.к. стараюсь применить простые и устойчивые решения. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 12:11 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
msLex Сам не пробовал, но судя по документации - нельзя ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 12:16 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
AR® Очень близкое к этому используется и приводит к ожиданиям deadlock... И ожиданий deadlock не бывает. Либо deadlock, либо ожидание освобождения ресурса. AR® стараюсь применить простые и устойчивые решения. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 12:20 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
AR®, попробуйте выбирать случайный ID из сформированного списка, список формируйте при условии readpast. Количество коллизий должно значительно сократиться, если будете выполнять запрос по точному значению ID. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 12:47 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
invm Очень близкое не означает такое же. Это верно. invm И ожиданий deadlock не бывает. Либо deadlock, либо ожидание освобождения ресурса. Не придирайтесь к словам. :) AR® Ну тогда блокируйте таблицу полностью - самое простое и устойчивое решение. Когда исчерпаю другие подходы, попробую. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 12:54 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
Владислав Колосов AR®, попробуйте выбирать случайный ID из сформированного списка, список формируйте при условии readpast. Количество коллизий должно значительно сократиться, если будете выполнять запрос по точному значению ID. Это было бы хорошо, если бы список был поменьше. Но подумать в эту сторону можно. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 12:57 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
AR®, берите первые сто свободных, какая вам разница. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 15:58 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
AR® invm Можно Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Очень близкое к этому используется и приводит к ожиданиям deadlock... Еще один любитель "рассказывать". Нет графа - нет дедлока. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2021, 16:23 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
aleks222 Еще один любитель "рассказывать". Нет графа - нет дедлока. Поясните. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2021, 11:21 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
AR® aleks222 Еще один любитель "рассказывать". Нет графа - нет дедлока. Поясните. Рассуждения о сферическом дедлоке в вакууме бесплодны. У вас же, ни конкретного запроса, ни DDL таблиц и индексов, ни графа дедлока. Балабольство в чистом виде, короче. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2021, 12:11 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
Бывая здесь не часто, я, видимо, не всё понимаю, что происходит на форуме... Неужели поводом к критике в мой адрес может служить единственная пропущенная мной запятая (между словами "ожиданиям" и "deadlock")? Благодарю всех, кто ответил по существу. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2021, 14:51 |
|
Как правильно взять единственную запись в обработку?
|
|||
---|---|---|---|
#18+
AR® Бывая здесь не часто, я, видимо, не всё понимаю, что происходит на форуме... Неужели поводом к критике в мой адрес может служить единственная пропущенная мной запятая (между словами "ожиданиям" и "deadlock")? Поводом для критики является безграмотность постановки задачи. Но мыши могут продолжать кушать кактус. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2021, 15:53 |
|
|
start [/forum/topic.php?fid=46&msg=40090333&tid=1684412]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
135ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 287ms |
total: | 526ms |
0 / 0 |