我正在尝试使用持续本地存储支持为所有嵌套的sequelize查询实现全局事务。我相信我已经正确地将命名空间设置为Sequelize.cls,因为它可以在预期的许多地方工作。
将数据从SQL Server迁移到Postgresql(sequelize models bonded)时,嵌套调用不使用该事务。代码如下。
var Steps = function() {
}
Steps.prototype = {
constructor:Steps,
IlIlce : function() {
var connection = this.dataplex;
var request = new sql.Request(connection);
return request.execute('Migrasyon_Il').then(function (recordsets) {
console.log('-=-=-=-=' + recordsets[0].length + ' İL kaydı bulundu');
return Promise.reduce(recordsets[0], function (total, row) {
return app.Sql.models.Il.create({
_Isim: row.AD,
_Entegrasyon: row.IL
});
}, 0);
}).then(function (total) {
return total;
}).catch(function (cause) {
throw cause;
});
}
Step2 : function() {},
Step3 : function() {},
Step4 : function() {},
}
我已将迁移步骤拆分为上面的对象原型。它在PostgreSQL / Sequelize事务中调用如下:
module.exports = {
run: function() {
var steps = new Steps();
steps.dataplex = new sql.Connection(config);
...
return steps.dataplex.connect().then(function() {
// app.Sql => Sequelize instance.
return app.Sql.transaction(function () { // <-- wrapper transaction
return Promise.delay(1).then(function() {
return steps.IlIlce();
}).then(function () {
return steps.Step2();
}).then(function () {
return steps.Step3();
}).then(function () {
return steps.Step4();
return true;
});
});
}).then(function () {
return true;
}).catch(function (cause) {
throw cause;
}).finally(function() {
steps.dataplex.close();
});
Steps函数中的Sequelize方法都不使用包装器事务。
我试过调试它:
将一个console.log()行放入 Transaction.prototype.prepareEnvironment()方法,它设置的位置 命名空间中的事务它过去了。
在Il模型定义中定义了一个beforeCreate()钩子,该钩子被使用 在Steps.prototype.IlIlce方法中。在此方法上下文中, Sequelize.cls.get('transaction')返回undefined。
答案 0 :(得分:1)
显然它与sequelize.js根本没有关系。问题的原因是,mssql所依赖的promise包不会为它的回调函数带来上下文。