node.js - 处理嵌套事务的简便方法

标签 node.js sequelize.js

假设有一个“addUser”函​​数,里面我们需要向“Account”表和“User”表中插入一条记录,那么这两个步骤也必须在一个事务中,所以我们将编写如下代码:

function addUser (userName, password) {
    sequelize.transaction(function () {
        return AccountModel.create(...)
        .then(UserModel.create(...))    
    })
}

但是,在另一个“addTeam”函数中,我们需要在“Team”表中插入一条记录,并使用上述函数创建一个管理员用户。该功能还需要包装在事务中。

那么问题来了,“addUser”函​​数有时需要开始一个新的事务,有时需要使用传入的事务。最明显的方式如下:

function addUser (userName, password, transaction) {
       let func = function (t) {
           return  AccountModel.create(..., t)
           .then(()=>UserModel.create(..., t)));
       if (transaction) func(t);
       else sequelize.transaction(x=>func(t));
}

function addTeam() {
     sequelize.transaction(x=> {
         TeamModel.create(..., x)
         .then(y=>addUser(x));
     });
}

显然,这很糟糕。如何轻松处理它,让交易对调用者完全透明,如下所示:

@Transaction
async function addUser(userName, password) {
    await AccountModel.create(...);
    await UserModel.create(...);
}

@Transaction
async function addTeam(...) {
    await TeamModel.create(...);
    await addUser(...);
} 

最佳答案

sequelize.transaction 接受一个选项对象 - 如果设置了 options.transaction,这将在事务中创建一个保存点(前提是 SQL 方言支持它),否则会创建一个新的交易

http://docs.sequelizejs.com/en/latest/api/sequelize/#transactionoptions-promise

所以你应该能够简单地做

sequelize.transaction({ transaction }, x=>func(t));

关于node.js - 处理嵌套事务的简便方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38069797/

相关文章:

node.js - NodeJS 和 SQLite3 在插入之前检查行是否存在

mysql - 多对多 : sequelize doesn't create methods

node.js - 序列化 : throw new Error (`${this.name}.belongsToMany called with something that' s not a subclass of Sequelize. 模型

sequelize.js - self.$expandAttributes 不是 Sequelize 的函数

javascript - 我在控制台 "You need to enable JavaScript to run this app."reactjs 中遇到错误

node.js - 如何使用事件发射器作为异步生成器

javascript - 在 Windows 上指定 Sequelize sqlite 路径

javascript - 从 Sequelize 中的另一个表中计数

javascript - 异步/等待 for 循环 | await 只在 async 函数中有效

node.js - 当我们在 node.js 中使用 promises 时,我们需要 process.exit(1) 吗