我正在为协作待办事项列表编写服务器。我的服务器必须通过发布/订阅服务回答多个客户端。
例如,以下是更新待办事项条目文本的代码:
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()和相关函数。