sequelize事务处理问题
发布于 6 年前 作者 iori2882 4263 次浏览 来自 问答

目前需求是同时添加2条数据库记录,这2个记录分别添加到A数据库表和B数据库表中 我的A数据库表:

zzzzzzzzzdddddz.jpg

我的B数据库表:

yyyyyyyyyyy.jpg

我在网上查到如下的代码:

fffffffffff.jpg

我的代码像下面这么写,为什么添加的是正确数据他直接回滚了啊?麻烦大家了~~~~~

代码开始:不知道为什么前2行不自动识别为代码

sequelize.transaction(function (t) { return BoxInfoController.addInfo(function (a,result) {

    }, {transaction:t})
        .then(function(){
            return BoxInfoController.addOa(function (a,result) {}, {transaction:t})
        });
}).then(function (results){
    /* 操作成功,事务会自动提交 */
}).catch(function(err){
    /* 操作失败,事件会自动回滚 */
});
10 回复

… … 看写法 好像BoxInfoController.addInfo()和addOa()中单独开了事务而已 比较好奇你执行的时候callback是什么了…

楼上正解。

两个函数你分别用了两个事物。

同一逻辑下,应该用同一个事物包裹

来自酷炫的 CNodeMD

@MUHM 不好意思,我这其实还不能很好的理解回调函数,你的意思是我把2个函数里的事物处理都去掉么?还是把2个方法合并成一个方法啊?

@axetroy 你的意思是我把2个函数里的事物处理都去掉么?还是把2个方法合并成一个方法啊?我不是特别懂啊?麻烦帮我解惑下 谢谢

现在看到回调就头大,不知道是不是应该这么写

add: function(addBoxInfo, callback) {
  return _dbManage.transaction(function (t) {
    return BoxInfoModel.create(addBoxInfo, { transaction: t })
      .then(function (boxInfo) {
        return BoxOaModel.create(addBoxInfo, { transaction: t })
          .then(function (boxOa) {
            return 'result'; //这里自己写需要的数据
          });
      });
  }).then(function (result) {
    callback(null, result);
  }).catch(function (err) {
    callback(err);
  });
}

然后执行

BoxInfoController.add(addBoxInfo,function(err,result){
	//
});

@MUHM 十分感谢,我现在也是,一在node.js里写for循环套数据库操作我就抓狂

@iori2882 把node升级了用async/await 吧

用async/await,大概这样写: sequelize.transaction(async t => { await BoxInfoModel.create(addBoxInfo, { transaction: t }) await BoxOaModel.create(addBoxInfo, { transaction: t }) })

可以自己加try catch

或者是用promise写

谢谢大家的回复~

回到顶部