我今天遇到了一个问题,即通过我的节点服务器上的连接插入期间或之后发生的问题。执行插入的代码如下所示:
// ...
username = esc(username);
firstname = esc(firstname);
lastname = esc(lastname);
var values = [username, firstname, lastname].join(',');
var statement = 'INSERT INTO User(Username,FirstName,LastName) VALUES({0});\n'+
'SELECT FirstName, LastName, Username, Id, IsActive FROM User WHERE Username={1};'
statement = merge( statement, [ values, username ] );
conn.query(statement, function(e, rows, fields){
e ? function() {
res.status(400);
var err = new Error;
err.name = 'Bad request';
err.message = 'A problem occurred during sign-up.';
err.details = e;
res.json(err);
}() : function(){
res.json( rows[1] );
}();
}
关于esc()
和merge()
的快速说明,这些只是帮助准备数据库语句的util函数。
上述代码已成功完成,即。响应是200,在主体中新插入的用户行。插入的行可以在一天中通过相同的连接查询。我今天下午才注意到,当通过shell运行以下通用查询时,该行丢失了。
SELECT Id, FirstName, LastName FROM User;
所以在那时我重新启动了数据库和节点服务器。不幸。现在它看起来完全消失了,以及任何可靠的故障排除路径。
以下是我的服务器设置感兴趣的一些细节。到目前为止,不知道如何(如果有的话)这些都是可疑的。
仅使用单个连接而不是conn pool(暂时)
multipleStatements=true
(显然上面的代码片段使用了这个)
SET autocommit = 0;
START TRANSACTION;
COMMIT;
让穷人每隔30秒保持活力,以避免连接超时:SELECT 1;
我整晚都在读书,但我的想法已经用完了。有什么建议?这可能是未提交数据的问题吗?如果是这样,有没有可靠的方法来调试它?更好的是,有什么方法可以阻止它吗?可能是什么原因?最后,如果在调试我的服务器时我发现处于这种状态的数据,是否有办法强制提交至少以便我不会丢失我的更改?