@tet-vivi 50 браузеров 6~7 Гб хавает, интересно есть ли возможность приумножить кол-во браузеров (:
Многопоточная работа с базой данных MySQL, чтобы несколько потоков не могли обратиться к одной записи одновременно.
-
В каждой записи БД есть столбец
status
Хочу взять в работу строку соstatus = 0и сразу же присвоитьstatus = 1, это значит, что строка сейчас находится в работе и другие потоки ее не должны взять.
Решил сделать через транзакцию:START TRANSACTION; SELECT @id:= id AS id, username, pass FROM t1 WHERE status = 0 LIMIT 1 FOR UPDATE; UPDATE t1 SET status= 1 WHERE id = @id; COMMIT;работает, но не в БАС. Использовал встроенный модуль SQL, но он не не обрабатывает больше 1 запроса за раз и не обрабатывает транзакции.
Как в БАС выполнить транзакцию или какие есть варианты решения без костылей, типа выгрузить сперва все id c БД в файл и работать с ним и с БД..
-
@Bot_Sculptor said in Многопоточная работа с базой данных MySQL, чтобы несколько потоков не могли обратиться к одной записи одновременно.:
работает, но не в БАС. Использовал встроенный модуль SQL, но он не не обрабатывает больше 1 запроса за раз и не обрабатывает транзакции.
В дополнительных настройках действия "Настроить соединение" для настроек диалекта укажите это значение:
{multipleStatements: true}, с типом поля expression
-
@GhostZ said in Многопоточная работа с базой данных MySQL, чтобы несколько потоков не могли обратиться к одной записи одновременно.:
{multipleStatements: true}, с типом поля expression
Спасибо, теперь транзакцию обрабатывает как нужно
И главное, раньше эту доп настройку читал смотрел, а как понадобилась, то и не вспомнил ) -
SELECT * FROM table FOR UPDATE SKIP LOCKED LIMIT 1;FOR UPDATE - блокировка транзакций до коммита или ролбека. SKIP LOCKED - не будет ждать коммита, а будет брать следующую строку, пропуская заблокированную.
Работать будет на каких-то новых версиях mariadb, года с 20-го. На более старых SKIP LOCKED, по-моему, нету.
-
@thepappo said in Многопоточная работа с базой данных MySQL, чтобы несколько потоков не могли обратиться к одной записи одновременно.:
SKIP LOCKED
К сожалению, база версии 5, а поддержка появилась с 8.0.1
Но я думаю каких-то долгих задержек не будет, т.к. база маленькая, все эти запросы выполняются сразу в одной транзакции, в одном действии, примерно за 0.4 сек
-
@Bot_Sculptor said in Многопоточная работа с базой данных MySQL, чтобы несколько потоков не могли обратиться к одной записи одновременно.:
К сожалению, база версии 5, а поддержка появилась с 8.0.1
Так поставь нормальную версию. Я под бас для тестов использую HeidiSQL, она автономная, никаких денверов и опенсерверов не требует. Ну а на дедике можно любую накатить.
@Bot_Sculptor said in Многопоточная работа с базой данных MySQL, чтобы несколько потоков не могли обратиться к одной записи одновременно.:
Но я думаю каких-то долгих задержек не будет, т.к. база маленькая, все эти запросы выполняются сразу в одной транзакции, в одном действии, примерно за 0.4 сек
Будет гонка, если строк в базе меньше чем потоков.
А еще лучше постгрес вместо мускуля.
-
Самый простой путь сделать колонку в базе = lok - выбирать с лок 0 и сразу лочить 1, по окончанию возвращать в 0.
Так как это не банковские операции и конкуренция не очень дикая, то в большинстве случаев этого будет достаточно.