0

有没有比在查询的开头添加事务并使用提交或回滚完成更好的方法来使用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;');
});

这看起来很笨重并且可能容易出错。我们正在使用通用池来管理 mariadb 客户端,因此以这种方式处理事务似乎可能会产生一些意想不到的后果。

4

1 回答 1

1

方案 A:如果autocommit设置为 1,那么每个语句都是它自己的事务。不需要BEGIN/COMMIT不需要。

计划 B:接受它并在此处为每个语句使用对 API 的单独调用:

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

如果 API 对 and 有特殊调用BEGIN,请COMMIT使用它们而不是执行相应的 SQL;通话中可能隐藏着一些重要的东西。

在这两种情况下,您都必须检查所有步骤中的错误。死锁可能会在您最不期望的时候发生。

于 2017-07-04T18:09:04.007 回答