假设有一个“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/