• Какой модуль использовать для парсинга url на node.js?

    @JimmyTheWorm Автор вопроса
    var query = req.query помогло
    Спасибо
  • Какую cms выбрать для создания сайта?

    @JimmyTheWorm Автор вопроса
    Юпитер Макс, Окей спасибо. Послушаю ещё другие ответы, но в любом случае спс)
  • Какую cms выбрать для создания сайта?

    @JimmyTheWorm Автор вопроса
    В woocommerce или в opencart'e есть возможность импорта товаров из excel?
  • Как вылечить данные скрипты?

    @JimmyTheWorm
    Tretlenz, скорее всего перестанет что-то работать
  • Deadlock, что за зверь, с чем едят?

    @JimmyTheWorm Автор вопроса
    Anton fon Faust, проект переписал, перезапустил. Посмотрим что получится.
    Не знаю, разрешено или нет тут такое, но можете написать свои личные контакты (vk/telegram/whatsapp/что-то ещё), я хочу связаться и отблагодарить. (можно удалить сразу)
    либо напишите мне на почту - fixer.ru@mail.ru
  • Deadlock, что за зверь, с чем едят?

    @JimmyTheWorm Автор вопроса
    Anton fon Faust, Просто огромное спасибо! ) буду пробовать внедрять своими кривыми руками))
  • Deadlock, что за зверь, с чем едят?

    @JimmyTheWorm Автор вопроса
    Владимир Скибин, Кстати, у меня встал ещё один вопрос. Почему после полной перезагрузки сервера несколько часов(может дней) нет никакой ошибки, хотя раньше она появлялась каждую минуту. По сути только deadlock'и сбросились, но одновременная запись+чтение как были так и остались, ничего не поменялось
  • Deadlock, что за зверь, с чем едят?

    @JimmyTheWorm Автор вопроса
    Владимир Скибин, Можно как-то сбросить зависшие deadlock'и вручную?
    Если я отключу autocommit и буду коммитить самостоятельно, я так понял это не решит проблему? Просто она возможно реже будет появляться?
    И ещё вопрос. Уровни изоляции - это только про чтение, или про запись тоже?
    Если ставлю "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE", то ошибка будет чаще выскакивать, но не будет фантомов?
  • Deadlock, что за зверь, с чем едят?

    @JimmyTheWorm Автор вопроса
    Anton fon Faust, а можно с вами как-то связаться, чтобы в режиме реального времени через чат пообщаться? А то ответов долго ждать.
    На сколько я могу предположить, у вас несколько Promise.all([clearTempLOOT(), clearAll_prices()]) одновременно срабатывает.
    Тут запрос идёт к двум разным таблицам: к таблице temp_loot и к таблице all_prices.
    Складывал бы все записи во временную таблицу

    Таблица temp_loot и есть временная. Перед каждой сессией она полностью очищается, потом туда закидываются данные, потом из неё данные перекидываются в all_prices.
    Стек подсказывает, что проблема возникает при запросе
    INSERT INTO all_prices(name, price_loot, have_loot, max_loot, updated_loot) (SELECT name, price_loot, have_loot, max_loot, updated_loot FROM `temp_loot` WHERE name NOT IN (SELECT name FROM `all_prices`));

    , который добавляет в общую таблицу все предметы(товары), которых нет в таблице temp_loot,
    либо при запросе
    update all_prices a set a.relevant_loot = 0 where a.name in (SELECT name FROM (select * from all_prices) as t1 WHERE name NOT IN (SELECT t.name FROM temp_loot t));

    который обновляет все цены в таблице all_prices, беря значения из temp_loot.

    Идентификаторов в таблице нет, единственное - столбец name содержит уникальные значения, которые не повторяются. И по этим значениям остальные таблицы добавляют свои цены.
    В проекте в сумме 6 временных таблиц, из которых цены перекидываются в основную таблицу.

    Вообще, изначально проект был построен на чтении и записи данных в файл. И в момент, когда что-то в многопотоке записывалось и считывалось одновременно возникала ошибка. Для её избежания и для оптимизации решил перейти на mysql, но по-видимому тут ещё больше проблем. Мне казалось sql умнее и сам умеет в очередь всё ставить.
    Когда ещё была реализована запись в файлы, была идея создать небольшой сервер, на который бы посылались запросы с чтением и записью из файла, и этот сервер бы сам в очередь ставил запись и чтение. Чтобы только он считывал и записывал и тогда проблем не было бы. Но это довольно муторно. Судя по всему здесь придётся реализовывать что-то подобное?
  • Deadlock, что за зверь, с чем едят?

    @JimmyTheWorm Автор вопроса
    Спасибо за ответ.
    Про изоляцию не понял, сейчас попробую покопать информацию.

    По поводу дедлоков:
    Разве sql не умеет запросы в очередь ставить? сам проект у меня построен таким образом, что в разных частях проекта в разное время асинхронно открываются пулы, записываются/читаются данные, потом закрываются соединения. я так понял, что в случае, если совпадает момент записи и чтения одной и той же таблицы, выскакивает блок.
  • Deadlock, что за зверь, с чем едят?

    @JimmyTheWorm Автор вопроса
    Anton fon Faust, разве это решит проблему с deadlock'ами?
  • Deadlock, что за зверь, с чем едят?

    @JimmyTheWorm Автор вопроса
    Как видите, тут приходится писать 100500 промисов, чтобы выполнять запросы последовательно. Если пробую объединить их в один connect.query, выдаёт ошибку. Так и должно быть? Неужели все так и делают
  • Deadlock, что за зверь, с чем едят?

    @JimmyTheWorm Автор вопроса
    Код в топике я взял из гугла. Вот пример моего кода:
    pool.getConnection(function (err, connection) {
                        function clearTempLOOT() {
                            return new Promise((resolveDB, rejectDB) => {
                                connection.query('DELETE FROM temp_loot', function (e, results, fields) {
                                    if (e) {
                                        log.error(e);
                                        return rejectDB();
                                    }
                                    else {
                                        return resolveDB();
                                    }
                                });
                            })
                        }
    
                        function clearAll_prices() {
                            return new Promise((resolveDB, rejectDB) => {
                                connection.query('update all_prices set have_loot = 0 where price_loot is not null', function (e, results, fields) {
                                    if (e) {
                                        log.error(e);
                                        return rejectDB('er2');
                                    }
                                    else {
                                        return resolveDB();
                                    }
                                });
                            })
                        }
    
                        function fillTempLOOT() {
                            return new Promise((resolveDB, rejectDB) => {
                                connection.query('INSERT INTO temp_loot (name, price_loot, have_loot, max_loot,updated_loot) VALUES ?', [arrDB], function (e, results, fields) {
                                    if (e) {
                                        log.error(e);
                                        return rejectDB();
                                    }
                                    else {
                                        return resolveDB();
                                    }
                                });
                            })
                        }
    
                        function addToAll_prices() {
                            return new Promise((resolveDB, rejectDB) => {
                                connection.query("INSERT INTO all_prices(name, price_loot, have_loot, max_loot, updated_loot) (SELECT name, price_loot, have_loot, max_loot, updated_loot FROM `temp_loot` WHERE name NOT IN (SELECT name FROM `all_prices`));", (e, val) => {
                                    if (e) {
                                        log.error(e);
                                        return rejectDB();
                                    }
                                    else {
                                        s = val;
                                        return resolveDB();
                                    }
                                });
                            })
                        }
    
                        function replaceNotRelevant() {
                            return new Promise((resolveDB, rejectDB) => {
                                connection.query("update all_prices a set a.relevant_loot = 0 where a.name in (SELECT name FROM (select * from all_prices) as t1 WHERE name NOT IN (SELECT t.name FROM temp_loot t)); ", (e, val) => {
                                    if (e) {
                                        log.error(e);
                                        return rejectDB();
                                    }
                                    else {
                                        log.info('Replaced %s prices', val.changedRows);
                                        return resolveDB();
                                    }
                                });
                            })
                        }
    
                        function replaceNewPrice() {
                            return new Promise((resolveDB, rejectDB) => {
                                connection.query("UPDATE all_prices a inner JOIN temp_loot t ON t.name = a.name SET a.price_loot = t.price_loot, a.have_loot = t.have_loot, a.max_loot = t.max_loot, a.updated_loot = t.updated_loot, a.relevant_loot = 1 where a.name is not null", (e, val) => {
                                    connection.release();
                                    if (e) {
                                        log.error(e);
                                        return rejectDB();
                                    }
                                    else {
                                        log.info('Replaced %s prices', val.changedRows);
                                        return resolveDB();
                                    }
                                });
                            })
                        }
    
                        Promise.all([clearTempLOOT(), clearAll_prices()])
                            .then(result => {
                                return fillTempLOOT();
                            })
                            .then(result => {
                                return addToAll_prices();
                            })
                            .then(result => {
                                return replaceNotRelevant();
                            })
                            .then(result => {
                                return replaceNewPrice();
                            })
                            .then(result => {
                                log.info('Loot db synced');
                                return resolve();
                            })
                            .catch(error => {
                                connection.release();
                                log.error(error);
                                return reject(error);
                            });
    
                    });


    т.е. тут присутствует запрос с взятием из другой таблицы данных и записью в основную
    INSERT INTO all_prices(name, price_loot, have_loot, max_loot, updated_loot) (SELECT name, price_loot, have_loot, max_loot, updated_loot FROM `temp_loot` WHERE name NOT IN (SELECT name FROM `all_prices`));


    Тем не менее, спасибо, что откликнулись
  • Deadlock, что за зверь, с чем едят?

    @JimmyTheWorm Автор вопроса
    Лентюй, спасибо, гуглить я и сам умею. Тем более доки на английском найти вообще ума не надо.

    Я задал вопрос здесь, чтобы найти человека, который популярно на пальцах сможет объяснить, в чём проблема и как её решить.

    Чтобы вы понимали, я с мускулом всего неделю работаю.