Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Sequelize中的原子操作_Sql_Node.js_Orm_Sequelize.js - Fatal编程技术网

Sql Sequelize中的原子操作

Sql Sequelize中的原子操作,sql,node.js,orm,sequelize.js,Sql,Node.js,Orm,Sequelize.js,我是新来续集的,所以我有一个非常简单的问题,也许是琐碎的问题。考虑文档上的例子: var project = Project.build({ title: 'my awesome project', description: 'woot woot. this will make me a rich man' }) var task = Task.build({ title: 'specify the project idea', description: 'bla', de

我是新来续集的,所以我有一个非常简单的问题,也许是琐碎的问题。考虑文档上的例子:

var project = Project.build({
  title: 'my awesome project',
  description: 'woot woot. this will make me a rich man'
})

var task = Task.build({
  title: 'specify the project idea',
  description: 'bla',
  deadline: new Date()
})
我想确保我要么保存这两个,要么一个也不保存。我该怎么做?
换句话说,我如何在多个表上自动执行创建/更新操作?

简而言之,使用事务:

sequelize.transaction().then(function (t) {
    return sequelize.Promise.all([
      Project.create({
        title: 'my awesome project',
        description: 'woot woot. this will make me a rich man'
      }, { transaction: t }), 
      Task.build({
        title: 'specify the project idea',
        description: 'bla',
        deadline: new Date()
      }, { transaction: t })
    ]).then(function onFulfilled (project, task) {
        return t.commit();
    }, function onRejected(err) {
        return t.rollback();
    });
});
在最新版本(2.0-rc2)中,也可以更简洁地写为:

sequelize.transaction(function (t) {
    return sequelize.Promise.all([
      Project.create({
        title: 'my awesome project',
        description: 'woot woot. this will make me a rich man'
      }, { transaction: t }), 
      Task.build({
        title: 'specify the project idea',
        description: 'bla',
        deadline: new Date()
      }, { transaction: t })
    ]);
});
通过将回调传递给
事务
,而不是调用
然后
。回调返回一个promsie链,事务被提交或回滚,这取决于返回的承诺是否成功。这意味着,如果传递给
Promise.all
的任何操作失败,事务将回滚