Уважаемые форумчане, просьба подсказать как составить запрос на UPDATE в конце выполнения шаблона.
В общем, для начала, база данных крутится на отдельной машине, стоит OpenServer и на нем MariaDB-10.3-x64, таблица InnoDB.
В начале выполнения шаблона стоит запрос к аккаунту вида:
По окончанию шаблона делаю следующий запрос:
В итоге получаю такую ситуацию когда из 50 потоков от 3 до 10 запросов на UPDATE не выполняются, у меня шаблон работает в цикле на 50 потоков в зеннопостере, акки берутся и апдейтятся постоянно, в потоке, я подозреваю, что когда идет лок таблицы на SELECT, то UPDATE в этот момент не выполняется, и не ждет своей очереди.
Как сделать так чтобы UPDATE происходил гарантированно? Лочить таблицу перед UPDATE тоже пробовал, результат тот же. Все переменные в запросе на 100% корректные и пустых там нет, проверял. Запрос выполняется и ошибок не выдает. Но постоянно некоторые строки в ДБ тупо не обновляются. на просторах интернета не нашел ответа на свой вопрос, у всех все работает с такими параметрами. Может надо MySQL движок заюзать вместо этой МарииДБ?
UPD: есть еще мысли что инициализация базы данных происходит в общем коде, может с этим связано, надо название перемнной базы данных поменять на апдейт к примеру не db а db1, сейчас попробую
В общем, для начала, база данных крутится на отдельной машине, стоит OpenServer и на нем MariaDB-10.3-x64, таблица InnoDB.
В начале выполнения шаблона стоит запрос к аккаунту вида:
запрос SELECT:
string db_host = project.Variables["ServerDB"].Value;
string db_user = "login";
string db_pswd = "pass";
string db_database = "database";
string db_timeout = "200";
string db_charset = "utf8";
DB db = new DB(db_host, db_user, db_pswd, db_database, db_timeout, db_charset);
db.query("LOCK TABLES accounts WRITE");
List<string> row = db.getRow("SELECT id, login, pass, email, proxy, use_time FROM accounts WHERE status='0' ORDER BY use_time LIMIT 1");
if ( row.Count > 0 ){
project.Variables["accID"].Value = row[0];
project.Variables["accLogin"].Value = row[1];
project.Variables["accPass"].Value = row[2];
project.Variables["emailLogin"].Value = row[3];
project.Variables["currProxy"].Value = row[4];
project.Variables["useTime"].Value = row[5]
db.query("UPDATE accounts SET status=1 WHERE id="+row[0]);
project.SendInfoToLog("Взяли "+row[1]+" в работу", true);
}
else {
project.SendInfoToLog("Не удалось взять аккаунт",true);
db.query("UNLOCK TABLES");
throw new Exception();
}
db.query("UNLOCK TABLES");
запрос UPDATE:
string db_host = project.Variables["ServerDB"].Value;
string db_user = "login";
string db_pswd = "pass";
string db_database = "database";
string db_timeout = "200";
string db_charset = "utf8";
DB db = new DB(db_host, db_user, db_pswd, db_database, db_timeout, db_charset);
int unixtime = (int)(DateTime.UtcNow - new DateTime(1970,1,1)).TotalSeconds;
string statement1 = project.Variables["statement1"].Value; //числовое значение
string statement2 = project.Variables["statement2"].Value; //числовое значение
string accid = project.Variables["accID"].Value;
//db.query("LOCK TABLES accounts WRITE");
db.query("UPDATE accounts SET status=0, statement1="+statement1+", statement2="+statement2+", use_time="+unixtime+" WHERE id="+accid);
//db.query("UNLOCK TABLES");
Как сделать так чтобы UPDATE происходил гарантированно? Лочить таблицу перед UPDATE тоже пробовал, результат тот же. Все переменные в запросе на 100% корректные и пустых там нет, проверял. Запрос выполняется и ошибок не выдает. Но постоянно некоторые строки в ДБ тупо не обновляются. на просторах интернета не нашел ответа на свой вопрос, у всех все работает с такими параметрами. Может надо MySQL движок заюзать вместо этой МарииДБ?
UPD: есть еще мысли что инициализация базы данных происходит в общем коде, может с этим связано, надо название перемнной базы данных поменять на апдейт к примеру не db а db1, сейчас попробую
Последнее редактирование: