Вопрос по MySQL, не отрабатывает UPDATE

tanaris

Client
Регистрация
07.01.2019
Сообщения
29
Благодарностей
2
Баллы
3
Уважаемые форумчане, просьба подсказать как составить запрос на UPDATE в конце выполнения шаблона.
В общем, для начала, база данных крутится на отдельной машине, стоит 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");
В итоге получаю такую ситуацию когда из 50 потоков от 3 до 10 запросов на UPDATE не выполняются, у меня шаблон работает в цикле на 50 потоков в зеннопостере, акки берутся и апдейтятся постоянно, в потоке, я подозреваю, что когда идет лок таблицы на SELECT, то UPDATE в этот момент не выполняется, и не ждет своей очереди.
Как сделать так чтобы UPDATE происходил гарантированно? Лочить таблицу перед UPDATE тоже пробовал, результат тот же. Все переменные в запросе на 100% корректные и пустых там нет, проверял. Запрос выполняется и ошибок не выдает. Но постоянно некоторые строки в ДБ тупо не обновляются. на просторах интернета не нашел ответа на свой вопрос, у всех все работает с такими параметрами. Может надо MySQL движок заюзать вместо этой МарииДБ?

UPD: есть еще мысли что инициализация базы данных происходит в общем коде, может с этим связано, надо название перемнной базы данных поменять на апдейт к примеру не db а db1, сейчас попробую
 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
попробуй подробно прологировать, какую строку получаешь, какой строка стала после первого апдейта, какой строка стала после второго апдейта. Ну и соответственно для этого дела дополнительно по селекту впихни после каждого апдейта. Поможет проанализировать. На первый взгляд, всё нормально, но c# методы для работы с бд в зенно мне мало знакомы
 

tanaris

Client
Регистрация
07.01.2019
Сообщения
29
Благодарностей
2
Баллы
3
попробуй подробно прологировать, какую строку получаешь, какой строка стала после первого апдейта, какой строка стала после второго апдейта. Ну и соответственно для этого дела дополнительно по селекту впихни после каждого апдейта. Поможет проанализировать. На первый взгляд, всё нормально, но c# методы для работы с бд в зенно мне мало знакомы
Спасибо за совет, это я все сделал, отследил уже какой именно аккаунт не апдейтится, но ошибок нету, все корректно выполняется, запрос происходит, но нет результата в таблице.

Я не очень соображаю в общем коде, я воспользовался готовым хелпером от WebBot , за что ему огромное спасибо, сейчас тестирую с разными названиями переменных метода DB(db1, db2... и т.д.), но там как то в общем коде вроде метод можно блокировать на время выполнения, "lock (CommonCode........." если не ошибаюсь, как использовать не изучил, просто недостаток знаний

UPD: Еще забыл добавить что в процессе выполнения шаблона есть множество обращений к другим таблицам БД, получается они все берут одну переменную db? если я задаю название переменной db везде? Я кароче в каждом кубике поменял названия переменных, и один пень 1 поток не смог проапдейтить результат. Уже всю голову сломал. НЕ работает.
 
Последнее редактирование:

tanaris

Client
Регистрация
07.01.2019
Сообщения
29
Благодарностей
2
Баллы
3
я понял одно, это все зеннокодонезависимо, в части отработки шаблона, просто тупо либо в логике обращений к БД, либо в работе метода в общем коде, понять не могу в чем.
ВОТ САМ МЕТОД:
C#:
public DB(string db_hostname, string db_username, string db_password, string db_database, string db_timeout, string db_charset="utf8"){
            hostname = db_hostname;
            username = db_username;
            password = db_password;
            database = db_database;
            timeout = db_timeout;
            charset = db_charset;
            result = String.Empty;
            string db_port =  "3306";
           
            var m = db_hostname.Split(':');
            if ( m.Length == 2 ){
                db_hostname = m[0];
                db_port = m[1];
            }
           
            var connectionString = "server="+db_hostname+";user="+db_username+";database="+db_database+";port="+db_port+";password="+db_password+";defaultcommandtimeout="+db_timeout+";pooling=False;";
            conn = new MySqlConnection(connectionString);

            open();
        }

       
        public void open(){
            conn.Open();
        }      

       
        public void close(){
            conn.Close();  
        }      
       
        public void query(string query){
            MySqlCommand command = new MySqlCommand(query, conn);
            command.ExecuteNonQuery();
        }
       
        public List<string> getAll(string query, string fieldSeparator="|"){
           
            var result = new List<string>();

            MySqlCommand command = new MySqlCommand(query, conn);          
           
            MySqlDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                List<string> fields = new List<string>();
                for(int i=0; i<reader.FieldCount; i++)
                fields.Add(reader[i].ToString());
               
                result.Add(string.Join(fieldSeparator,fields));
               
            }
            reader.Close();
           
            return result;          
        }

        public List<string> getRow(string query){

            MySqlCommand command = new MySqlCommand(query, conn);          
           
            MySqlDataReader reader = command.ExecuteReader();
           
            if ( reader.Read() ){
       
                List<string> result = new List<string>();
                for(int i=0; i<reader.FieldCount; i++)
                result.Add(reader[i].ToString());

                reader.Close();
                return result;              
            }
           
            reader.Close();
            return new List<string>();          
        }
       
       
        public string getOne(string query){
             MySqlCommand command = new MySqlCommand(query, conn);
            string result = "";
            try { result = command.ExecuteScalar().ToString(); } catch{}
            return result;
        }
       
       
        public string escapeString(string text){          
            return MySql.Data.MySqlClient.MySqlHelper.EscapeString(text);
        }
    }
}
 
Последнее редактирование:

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113
Тоже в своих шаблонах использую методы @WebBot , проблем нет, но работа ведется с MySQL, но не думаю что проблема в MariaDB.
Первое что я бы сделал, проставил в запросах одинарные кавычки, на всякий случай :-)
Второе создал бы тестовый шаблон, тестовую таблицу и потестил в разных вариантах, поигрался бы с timeout*ами, локами и т.д.
 
Последнее редактирование:

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