阅读
https://stackoverflow.com/a/14797359/4158593:关于nodejs单线程并且它接受async函数的第一个参数,处理它然后使用回调在一切准备就绪时做出响应.令我感到困惑的是,如果我有多个查询需要一次性解除,并告诉nodeJS通过将其添加到队列中来阻止其他请求.
为此,我意识到我需要将我的查询包装在另一个回调中.并且承诺做得很好.
const psqlClient = psqlPool.connect();
return psqlClient.query(`SELECT username FROM usernames WHERE username=$1`, ['me'])
.then((data) => {
if(!data.rows[0].username) {
psqlClient.query(`INSERT INTO usernames (username) VALUES ('me')`);
}
else { ... }
});
注册时使用此代码,以检查插入前是否未使用用户名.因此,nodejs将其他请求放入队列非常重要,并确保同时选择和插入.由于此代码可能允许同时发送具有相同用户名的用户选择已经使用的用户名,因此将插入两个用户名.
问题
>上面的代码是否一次执行所有查询?
>如果1是正确的,如果我要改变这样的代码
const psqlClient = psqlPool.connect();
return psqlClient.query(`SELECT username FROM usernames WHERE username=$1`, ['me'], function(err, reply) {
if(!reply.rows[0].username) {
psqlClient.query(`INSERT INTO usernames (username) VALUES ('me')`);
}
});
这会影响行为吗?
>如果1错了,应该如何解决?我将需要这种模式(主要使用select和insert / update一个接一个)来确保我的XML站点地图不包含超过50000个网址,方法是存储动态发生的数据库中每个文件的计数.
最佳答案 在您的情况下唯一可以保证数据完整性的是单个SELECT-> INSERT查询,这里已经多次讨论过了.
一些例子:
> Is SELECT or INSERT in a function prone to race conditions?
> Get Id from a conditional INSERT
你应该能够在这里找到更多;)
我还在pg-promise的一个SELECT ⇒ INSERT例子中触及了这个主题.
但是有一个替代方案,可以使任何重复插入产生冲突,在这种情况下,您可以重新运行您的选择以获取新记录.但它并不总是一个合适的解决方案.