Ещё раз про запросы к базе в многопотоке

Zippy

Client
Регистрация
14.12.2021
Сообщения
65
Благодарностей
6
Баллы
8
Перечитал топики на эту тему, но не совсем понял, что лучше применить в моём случае. Как я понял, в идеале, сделать по этой статье, чтобы каждый поток работал со своей сессией, но это для меня пока сложновато и треубует времени, а у меня сроки горят и хочется сделать доступным, пусть и не очень правильным способом, через костыли. Вроде бы этот способ мне подходит, но есть вопросы.
Допустим, в базе 100 строк и у каждой строки уникальный id, от 1 до 100. Добавляю столбец "статус". В зенке генерирую рандомно число от 1 до 100, беру в базе строку, у которой такой айди и "статус"="свободен". После этого, ещё один запрос, который меняет статус на "занят".
Вопрос: А если одновременно несколько потоков возьмут один и тот же айди (например, в промежутке между запросами select и update)? Можно ли этого избежать или они по очереди делают запросы к бд (где то видел такую инфу, но не уверен в том, что конкретно имеется ввиду)?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

Zippy

Client
Регистрация
14.12.2021
Сообщения
65
Благодарностей
6
Баллы
8
еще как возьмут. нужно обязательно локировать, на уровне зенки или на уровне базы.
Как? Только разбираться и делать, чтобы у каждого потока был свой конект к базе? На форуме пишут, что ещё можно реализовать логику, при которой запросы к базе делает только один поток, а в многопотоке уже работает со списком, беря строку с удалением. Но что-то я не одупляю, как это сделать в рамках одного шаблона. Будьте любезны, дайте подсказку)
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
гугли
LOCK TABLES
UNLOCK TABLES
еще есть SELECT ... LOCK IN SHARE MODE, SELECT ... FOR UPDATE , в общем это на уровне базы.

на уровне зенки это lock в c# , тоже куча материалов на форуме.
 
  • Спасибо
Реакции: Zippy

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 261
Благодарностей
679
Баллы
113
Как? Только разбираться и делать, чтобы у каждого потока был свой конект к базе? На форуме пишут, что ещё можно реализовать логику, при которой запросы к базе делает только один поток, а в многопотоке уже работает со списком, беря строку с удалением. Но что-то я не одупляю, как это сделать в рамках одного шаблона. Будьте любезны, дайте подсказку)
Можно попробовать через EntityFramework сделать если через студию работаете, там и про дибильный sql забудете и запросы там пачкой выполняются, ещё и работать с сущностями будете как белый человек )
 
  • Спасибо
Реакции: Zippy

Zippy

Client
Регистрация
14.12.2021
Сообщения
65
Благодарностей
6
Баллы
8
гугли
LOCK TABLES
UNLOCK TABLES
еще есть SELECT ... LOCK IN SHARE MODE, SELECT ... FOR UPDATE , в общем это на уровне базы.

на уровне зенки это lock в c# , тоже куча материалов на форуме.
Сделал тестовый шаблон, но что-то не то. Запрос выдаёт 1583 строки, и я ожидаю, что столько же будет скопировано в другую таблицу. Запускаю в 10 потоков, но более 6 не запускается и проект завершается, число перенесённых строк рандомное, когда 50, когда 100. По моей логике шаблон должен остановиться, когда запрос вернёт пустую строку.
102625

102626


Первый запрос:
LOCK TABLES test.table1 WRITE;
SELECT mail FROM test.table1 WHERE used='no' AND id='{-Variable.string_id-}';
UPDATE test.table1 SET used='yes' WHERE id ='{-Variable.string_id-}';
UNLOCK TABLES;
Второй запрос:
insert INTO test.table2 (mail,rnd_id) VALUES('{-Variable.mail-}','{-Variable.string_id-}')
 

deskuznetsov

Client
Регистрация
29.08.2019
Сообщения
528
Благодарностей
363
Баллы
63
  • Спасибо
Реакции: Zippy

Zippy

Client
Регистрация
14.12.2021
Сообщения
65
Благодарностей
6
Баллы
8
Лучше почитай и настрой под себя взяв примеры отсюда https://zennolab.com/discussion/threads/zagotovka-dlja-raboty-s-bd-mysql-v-kubike-c.64766/
Там уже готовые примеры есть.
Спасибо! Взял примеры, настроил под себя и всё получилось. Теперь это просто песня! Скорость выросла колоссально.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)