Используйте транзакции с mariadb и node.js

Есть ли лучший способ использовать транзакции с библиотекой mariasql, чем добавление BEGIN к началу запроса и завершению с фиксацией или откатом?

В настоящее время, если я хочу обернуть серию запросов в транзакцию, я должен сделать что-то вроде этого:

const MariaClient = require('mariasql');
let client = new MariaClient();

client.connect({
    host: "127.0.0.1",
    user: "user",
    password: "pass",
    db: "some_db",
    multiStatements: true
});

client.query('BEGIN; INSERT INTO some_table VALUES ("a0","b0"), ("a1","b1"), ("a2","b2");', function (err) {
    if (err) {
        client.query('ROLLBACK;');
    }
    client.query('COMMIT;');
});

Это кажется неуклюжим и потенциально подверженным ошибкам. Мы используем generic-pool для управления клиентом mariadb, поэтому может возникнуть непредвиденное последствие обработки транзакций таким образом.

1 ответ

План А: Если autocommit устанавливается в 1, тогда каждый оператор является своей собственной транзакцией. нет BEGIN/COMMIT необходимо.

План Б: смиритесь с этим и используйте отдельные вызовы API для каждого оператора здесь:

BEGIN;
some SQL statement;
some SQL statement;
some SQL statement;
COMMIT;

Если API имеет специальные вызовы для BEGIN а также COMMITиспользуйте их вместо выполнения соответствующего SQL; в вызове может быть что-то важное.

В обоих случаях вы должны проверять наличие ошибок на всех этапах. Могут возникнуть тупики, когда вы меньше всего их ожидаете.

Другие вопросы по тегам