【问题标题】:Use transactions with mariadb and node.js使用 mariadb 和 node.js 的事务
【发布时间】:2017-11-26 05:52:24
【问题描述】:

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 客户端,因此以这种方式处理事务似乎会产生一些意想不到的后果。

【问题讨论】:

  • client.beginTransaction 不存在?如果没有,请改用 mysql 库

标签: node.js transactions mariadb mariasql


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多