Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
23.10.2019, 09:19
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
Добрый день, Есть такая задача, обеспечить параллельную выборку данных двумя (или более) пользователями, чтобы они не выбрали одни и те же записи для обработки. Пользователь 1 выбирает студентов из школ 1,2 и 3. Пользователь 2 пытается выбрать студентов из школ 3,4 и 5. Поскольку пользователь 1 начал первым, он должен получить список студентов из школ 1, 2 и 3 и пометить их для обработки. Пользователь 2 должен получить студентов только из школ 4 и 5. При этом надо использовать минимально необходимый уровень изоляции. Понятно, что можно залочить всю таблицу и добиться результата, но это не приемлемо. Я думаю сделать так: 1. Установить уровень изоляции repeatable read 2. Открыть транзакцию 3. Сохранить студентов из школ 1, 2 и 3 в таблицу-переменную 4. В той же транзакции проапдейтить записи студентов со статусом 'S' (чтобы другой пользователь эти записи не трогал) 5. Закомиттить транзакцию. В это время второй пользователь попытается запустить тот-же код для школ 3,4 и 5. Он не сможет залочить нужные записи и его сессия будет ждать окончания транзакции первого пользователя. Когда первый пользователь закончит свою транзакцию, то студенты школы 3 уже будет помечены статусом 'S' и второй пользователь их не получит. Подскажите, я мыслю в правильном направлении? Примерный код ниже. Спасибо. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.10.2019, 09:43
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
Roust_m, как минимум, эти два запроса Roust_m Код: sql 1. 2. 3. 4. 5. 6. 7. 8. можно объединить в один Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.10.2019, 09:49
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
court, Хорошо, а как по поводу уровня изоляции? Он достаточный для получения нужного результата? Также не является ли он избыточным? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.10.2019, 09:57
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
Roust_m, авторЕсть такая задача, обеспечить параллельную выборку данных двумя (или более) пользователями, чтобы они не выбрали одни и те же записи для обработки. readpast ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.10.2019, 10:10
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
TaPaKRoust_m, авторЕсть такая задача, обеспечить параллельную выборку данных двумя (или более) пользователями, чтобы они не выбрали одни и те же записи для обработки. readpast Как-то не очень надежно. А вдруг там записи залочены по другой причине (другой операции) и ни один из пользователей их не получит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.10.2019, 10:15
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
Roust_mTaPaKRoust_m, пропущено... readpast Как-то не очень надежно. А вдруг там записи залочены по другой причине (другой операции) и ни один из пользователей их не получит. repeatable read не обеспечивает праллельную обработку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.10.2019, 10:27
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
Roust_m, Как быть, если один хочет (1, 2, 3), а другой, например, (2, 3)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.10.2019, 10:33
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
Пусть юзеры вызывают ХП. А ХП заносит сделанный выбор в табличку. Другой юзер тоже заносит свой выбор, но только то, чего еще там нет. Потом селектит только свое вставленное. Логику можно сделать более сложной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.10.2019, 10:44
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
Roust_m, В общем, вот вам "рыба", дальше допилите под свои требования: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
23.10.2019, 10:47
|
|||
|---|---|---|---|
|
|||
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
Roust_mЕсть такая задача, обеспечить параллельную выборку данных двумя (или более) пользователями, чтобы они не выбрали одни и те же записи для обработки. Очередь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2019, 00:55
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
invmRoust_m, Как быть, если один хочет (1, 2, 3), а другой, например, (2, 3)? Если тот, кто хочет 1,2,3 пришел первым, то второй ничего не получает и должен выбрать что-то другое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2019, 00:57
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
L_argoПусть юзеры вызывают ХП. А ХП заносит сделанный выбор в табличку. Другой юзер тоже заносит свой выбор, но только то, чего еще там нет. Потом селектит только свое вставленное. Логику можно сделать более сложной. Примерно тоже самое я и пытаюсь сделать. Юзеры заносят выборку в свою таблицу и в общей таблице помечают то что они выбрали, чтобы другие это же не взяли. Просто надо разрулить ситуацию когда они почти одновременно обращаются за выборкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2019, 00:58
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
Ftt330Roust_mЕсть такая задача, обеспечить параллельную выборку данных двумя (или более) пользователями, чтобы они не выбрали одни и те же записи для обработки. Очередь. Не совсем понятно. В какой форме? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2019, 01:37
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
invmRoust_m, В общем, вот вам "рыба", дальше допилите под свои требования: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. Я не совсем понимаю как это работает. Залочить надо таблицу stg_student (желательно не всю, а минимально необходимые записи), после чего выбрать из нее нужные записи и пометить их как выбранные, чтобы следующий пользователь не взял себе те же самые записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2019, 08:45
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
Просто надо разрулить ситуацию когда они почти одновременно обращаются за выборкой. Если это будет делать одна ХП, то коллизий не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2019, 08:59
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
L_argoПросто надо разрулить ситуацию когда они почти одновременно обращаются за выборкой. Если это будет делать одна ХП, то коллизий не будет. Это будет реализовано в одной хранимой процедуре, но запускаться она будет многими пользователями. Почему не будет коллизий? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2019, 10:06
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
Roust_mЗалочить надо таблицу stg_studentТаблицу надо не лочить, а сериализовать к ней доступ по определенным критериям. Что данный код и делает на основе пользовательских блокировок. Если есть справочник школ, то можно еще и так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2019, 10:12
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
Roust_mЭто будет реализовано в одной хранимой процедуре, но запускаться она будет многими пользователями. Почему не будет коллизий?Потому что эта процедура сначала вставляет только свое и потом читает только свое. Шутки ради можно индекс уникальный поставить, чтобы вставить одну и ту же ID два раза было в принципе нельзя. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2019, 10:15
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
L_argoRoust_mЭто будет реализовано в одной хранимой процедуре, но запускаться она будет многими пользователями. Почему не будет коллизий?Потому что эта процедура сначала вставляет только свое и потом читает только свое. Шутки ради можно индекс уникальный поставить, чтобы вставить одну и ту же ID два раза было в принципе нельзя. :) т.е. пусть валится в ошибки это нормально ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2019, 12:03
|
|||
|---|---|---|---|
|
|||
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
Roust_m, вот Вам демо пример реализации. создаёте сессию 1, копируете пример: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. создаёте сессию 2, имитирующую. работу второго пользователя, та же последовательность запросов, что и для первого: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2019, 12:06
|
|||
|---|---|---|---|
|
|||
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
В первом запросе для наглядности лучше указать set val = 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.10.2019, 05:58
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
Владислав Колосов, Спасибо, попробую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.10.2019, 10:54
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
Roust_mПользователь 1 выбирает студентов из школ 1,2 и 3. Пользователь 2 пытается выбрать студентов из школ 3,4 и 5. Поскольку пользователь 1 начал первым, он должен получить список студентов из школ 1, 2 и 3 и пометить их для обработки. Пользователь 2 должен получить студентов только из школ 4 и 5. При этом надо использовать минимально необходимый уровень изоляции. Понятно, что можно залочить всю таблицу и добиться результата, но это не приемлемо.Каюсь, невнимательно прочитал задачу. Если есть справочник школ, решается так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.10.2019, 10:22
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
invmRoust_mПользователь 1 выбирает студентов из школ 1,2 и 3. Пользователь 2 пытается выбрать студентов из школ 3,4 и 5. Поскольку пользователь 1 начал первым, он должен получить список студентов из школ 1, 2 и 3 и пометить их для обработки. Пользователь 2 должен получить студентов только из школ 4 и 5. При этом надо использовать минимально необходимый уровень изоляции. Понятно, что можно залочить всю таблицу и добиться результата, но это не приемлемо.Каюсь, невнимательно прочитал задачу. Если есть справочник школ, решается так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Даже если объединить два запроса внутри транзакции как предложил court и установить режим изоляции как repeatable read, у меня не получилось разделить пользователей. Пользователь 1: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Пользователь 2: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Оба пользователя получают пересекающиеся данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.10.2019, 10:25
|
|||
|---|---|---|---|
Параллельная выборка данных двумя или более пользователями |
|||
|
#18+
Roust_m, авторДаже если объединить два запроса внутри транзакции как предложил court и установить режим изоляции как repeatable read, у меня не получилось разделить пользователей. а точнее сделать всё иначе, то почему-то не работает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=46&mobile=1&tid=1687051]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
23ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 342ms |

| 0 / 0 |
