Используйте транзакции с 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; в вызове может быть что-то важное.
В обоих случаях вы должны проверять наличие ошибок на всех этапах. Могут возникнуть тупики, когда вы меньше всего их ожидаете.