Многопоточность need help

prostors

Client
Регистрация
16.12.2020
Сообщения
1 045
Благодарностей
34
Баллы
48
есть бд mysql, нужно сделать так, чтобы каждый поток брал 100% уникальные значения, без очередей, при этом количество потоков разное

блокирование всей таблицы или строки - хз что делает - ставит запросы в очередь в ожидании разблокировки

если указать данным в БД ID по количеству потоков от 1 до 10 и привязаться к нему, но что делать, если количество потоков нужно сменить, id переписывать что-ли?

как решаете вопрос люди?
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 820
Благодарностей
2 030
Баллы
113

prostors

Client
Регистрация
16.12.2020
Сообщения
1 045
Благодарностей
34
Баллы
48

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 529
Благодарностей
3 375
Баллы
113
Используйте блокировку в базе данных, есть такая функция для транзакций.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113
обращение к базе оборачивай в лок, и ставь метку у взятой строки в работу. и не будет никаких пересечений.
без очереди у тебя никогда не получится брать уникум ни откуда, ни с базы, ни со списка, поэтому забудь это и используй лок.
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 774
Благодарностей
1 392
Баллы
113
сначала сделать апдейт подходящей под условия строки и записать метку, а потом с ней работать .... в типе таблиц innodb будет построчная блокировка в этом случае и несколько потоков никак одновременно одну и ту же запись заапдейтить не смогут
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 045
Благодарностей
34
Баллы
48
обращение к базе оборачивай в лок, и ставь метку у взятой строки в работу. и не будет никаких пересечений.
без очереди у тебя никогда не получится брать уникум ни откуда, ни с базы, ни со списка, поэтому забудь это и используй лок.
а что будет если одновременно 3 потока зайдут и будут пытаться поставить базу в лок? будет очередь, какой-то из 3 лочит, остальные ждут - зачем мне ждуны?

мне нужно, чтобы 3 потока одновременно брали уникальные строки
 

prostors

Client
Регистрация
16.12.2020
Сообщения
1 045
Благодарностей
34
Баллы
48
сначала сделать апдейт подходящей под условия строки и записать метку, а потом с ней работать .... в типе таблиц innodb будет построчная блокировка в этом случае и несколько потоков никак одновременно одну и ту же запись заапдейтить не смогут
локирование с помощью FOR UPDATE работает на запись, чтение возможно, после разблокировки второй поток вносит правки в ту же строку

или нужно объяснение как FOR UPDATE работает правильно
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 642
Баллы
113
а что будет если одновременно 3 потока зайдут и будут пытаться поставить базу в лок? будет очередь, какой-то из 3 лочит, остальные ждут - зачем мне ждуны?

мне нужно, чтобы 3 потока одновременно брали уникальные строки
вариант @WebBot с минимальным ожиданием. Но самое ожидание вероятно при любом раскладе
 
Регистрация
05.06.2019
Сообщения
570
Благодарностей
455
Баллы
63
обращение к базе оборачивай в лок, и ставь метку у взятой строки в работу. и не будет никаких пересечений.
без очереди у тебя никогда не получится брать уникум ни откуда, ни с базы, ни со списка, поэтому забудь это и используй лок.
ну а как же, к примеру актор? на прямую да, но можно через посредника.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113
а что будет если одновременно 3 потока зайдут и будут пытаться поставить базу в лок? будет очередь, какой-то из 3 лочит, остальные ждут - зачем мне ждуны?

мне нужно, чтобы 3 потока одновременно брали уникальные строки
У меня 2000 потоков работают через файловую базу, через лок (причем лок использую не в одном месте, а везде где есть запись в базу), и не замечено никаких проблем с "ждунами", а ты за 3 потока переживаешь ?
Ну вообще непонятна задача, с одной стороны ты хочешь что бы строки брались без повтора, кучей шаблонов, с другой стороны ты не хочешь делать очередь для этих потоков. Ну ведь ясен пень, что без очереди потоки будут хватать одну и туже строку. Поэтому либо лок внутри шаблона, который выстраивает все шаблоны в очередь, либо как предлагают другие участника , лок средствами базы данных, тогда у тебя будут в очередь выстраиваться именно запросы внутри базы. Как там технически лок в базе устроен, этого я не знаю, так как работаю с SQLite, а для нее достаточно лока внутри шаблона, но суть одна, нужны уники, используешь лок, что с базой, что с другими ресурсами.
 

Phoenix78

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

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