我在环回应用程序中看到了奇怪的行为。我将尝试在下面描述它。
我有一个 BaseModel,我的所有模型都继承自它,它对"访问"和"之前保存"具有操作钩子,以出于多租户原因填充列。它需要访问当前用户,我正在按如下方式获取它:
var httpContext = require('loopback').getCurrentContext();
var accessToken = httpContext.get('accessToken');
const userId = accessToken && accessToken.userId;
然后,我的一个模型需要在另一个模型中插入记录。模型 1 和模型 2 具有一对一的关系。我为它添加了一个远程方法,我正在事务中执行此操作,如下所示:
Model1.beginTransaction({ isolationLevel: Model1.Transaction.READ_COMMITTED })
.then(function(tx) {
transaction = tx;
return Model1.create({ paramId: param }, { transaction: transaction });
})
.then(function(model1) {
return Model2.create({ model1: model1 }, { transaction: transaction });
})
.then(function(model2) {
model2Instance = model2;
return transaction.commit();
})
.then(function() {
cb(null, model2Instance);
})
.catch(function(err) {
if (transaction) {
transaction.rollback(function(rbe) {
cb(err, null);
});
return;
}
cb(err, null);
})
运行 Model2.create 步骤时,由于未定义访问令牌,挂钩失败。
如果我确实从我的模型调用中删除 { 事务:事务 },则两个记录都已成功创建,尽管没有按预期使用数据库事务。
我错过了什么?
尝试在环回中使用事务,但由于环回端的文档不完整或非描述性,没有成功。
最好使用 http://knexjs.org/来构建查询和事务。
这是一个参考链接,说明相同。如何在环回中实现 ACID 事务http://knexjs.org/#Transactions