当我使用promise插入多个数据时遇到问题,有时它可以正常工作,但其他时候会给我这个错误:
我的代码就是这样:
return Promise.all([
Promise.all(createBistamp),
Promise.all(createSlstamp),
listOfResults,
i
]).then(function(listOfResults2) {
for(var j=0; j<resultArticle.length; j++) {
if(arm === 'Arm-1') {
}
if(arm === 'Arm-1-11') {
}
}
if(arm === 'Arm-1') {
console.log("PROMISE ARM-1");
return Promise.all([insertBi,insertBi2,insertSl]).then(function (insertEnd) {
res.send("true");
}).catch(function(err) {
console.log(err);
});
}
if(arm === 'Arm-1-11') {
console.log("PROMISE ARM-1-11");
return Promise.all([insertBi,insertBi2,insertSl,insertSlSaida]).then(function (insertEnd) {
res.send("true");
}).catch(function(err) {
console.log(err);
});
}
}).catch(function(err) {
console.log(err);
});
我删除了ifs和for中的代码行,但它是在数据库中插入的。
插入示例:
var insertBi2 = request.query("INSERT INTO bi2 (bi2stamp,alvstamp1,identificacao1,szzstamp1,zona1,bostamp,ousrinis,ousrdata,ousrhora,usrinis,usrdata,usrhora)"+
"VALUES ('"+bistamp+"','AB16083056009,454383576','2','Adm13010764745,450449475','1','"+bostamp+"','WWW','"+data+"','"+time+"','WWW','"+data+"','"+time+"')");
完整代码: http://pastebin.com/DTjtXvDt
这是我的结构,我不知道我是否能很好地兑现承诺。
谢谢
答案 0 :(得分:0)
如果要在循环中插入数据或更新数据,则最好在循环中进行所有查询并存储它们,然后在单个事务中一次执行所有查询。会为您省去很多麻烦
答案 1 :(得分:0)
我最近也遇到了这个问题。
error: RequestError: Transaction (Process ID 72) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
解决方案 -
桌子上没有一个索引。因此,我在唯一标识符列上创建了一个非聚集唯一索引。
当这个解决方案奏效时,我感到很惊讶
代码中有一个更新操作,没有选择操作。所以,让我好奇地做一些研究。我遇到了用于锁定资源的 lock granularity
机制。就我而言,锁定必须在行级别而不是页面级别。
注意:
对于聚簇表,数据页存储在(聚簇)索引结构的叶级,因此使用索引键锁而不是行锁进行锁定。