节点js - 请求错误事务已死锁

时间:2017-02-09 16:44:09

标签: javascript node.js express

当我使用promise插入多个数据时遇到问题,有时它可以正常工作,但其他时候会给我这个错误:

enter image description here

我的代码就是这样:

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

这是我的结构,我不知道我是否能很好地兑现承诺。

谢谢

2 个答案:

答案 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 机制。就我而言,锁定必须在行级别而不是页面级别。

注意:
对于聚簇表,数据页存储在(聚簇)索引结构的叶级,因此使用索引键锁而不是行锁进行锁定。

进一步阅读
https://www.sqlshack.com/locking-sql-server/