使用sqlite互斥锁处理并发事务?

时间:2017-01-07 11:12:29

标签: node.js concurrency sqlite transactions

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

例如,以下是更新待办事项条目文本的代码:

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});
}

问题是: 每当线程正在更新待办事项时,第二个更新请求可以到达并触发新事务的开始,这会导致错误:"无法从事务中启动事务"。

解决这个问题的最简单方法似乎是在开始交易之前获取互斥锁。 我没有找到一种简单,令人信服的方式将节点与节点一起使用,我想知道最好的解决方案是扩展节点sqlite API以包装sqlite3_mutex_enter()和相关函数。

0 个答案:

没有答案