Node.js 使用sqlite互斥体处理并发事务?

Node.js 使用sqlite互斥体处理并发事务?,node.js,concurrency,sqlite,transactions,Node.js,Concurrency,Sqlite,Transactions,我正在为协作待办事项列表编写服务器。我的服务器必须通过发布/订阅服务应答多个客户端 例如,以下是更新todo条目文本的代码: db.run("BEGIN;"); var version = undefined; try { db.get("SELECT version FROM todos WHERE id = ?", [msg.id], function (err, row) { if (err) throw err; console.log("

我正在为协作待办事项列表编写服务器。我的服务器必须通过发布/订阅服务应答多个客户端

例如,以下是更新todo条目文本的代码:

db.run("BEGIN;");
var version = undefined;
try
{
    db.get("SELECT version FROM todos WHERE id = ?", [msg.id], function (err, row)
    {
        if (err) throw err;
        console.log("version : " + row.version);
        version = row.version + 1;

        db.run("UPDATE todos SET title = ?, version = ? WHERE id = ?", [msg.title, version, msg.id], function(err){
            if (err) throw err;
            db.run("COMMIT;");
            publish("broadcast", {cmd: "edit", todo: {id: msg.id, title: msg.title, version: version}});
        });
    });   
}
catch (err)
{
    db.run("ROLLBACK;");
    console.log(err);
    publish(msg.sender, {err: err, request: msg});
}
问题是: 每当线程更新todo时,第二个更新请求就会到达并触发新事务的启动,这会导致错误:“无法从事务中启动事务”

解决这个问题的最简单方法似乎是在启动事务之前获取互斥锁。
我没有找到一种简单、令人信服的方法将互斥体与node一起使用,我想知道最好的解决方案是否是扩展node sqlite API来包装sqlite3_mutex_enter()和相关函数。

如果node.js没有内置互斥体,为什么要使用它?这实际上是一个很好的观点。我正在为发布/订阅服务编写一个示例,我希望它尽可能容易在个人计算机上测试。我希望我的代码需要尽可能少的配置才能运行。客户端应用程序是用javascript和vue.js制作的。SQLite不需要配置,并且只使用一个npm命令安装。实际上,我是第一次使用node,这些选择对我当时的知识来说是有意义的。也许我应该切换到Python…如果node.js没有内置互斥体,为什么要使用它?这其实是一个很好的观点。我正在为发布/订阅服务编写一个示例,我希望它尽可能容易在个人计算机上测试。我希望我的代码需要尽可能少的配置才能运行。客户端应用程序是用javascript和vue.js制作的。SQLite不需要配置,并且只使用一个npm命令安装。实际上,我是第一次使用node,这些选择对我当时的知识来说是有意义的。也许我应该换成Python。。。