Sequelize CLS交易未使用

时间:2015-03-30 16:44:26

标签: transactions sequelize.js

我正在尝试使用持续本地存储支持为所有嵌套的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。

1 个答案:

答案 0 :(得分:1)

显然它与sequ​​elize.js根本没有关系。问题的原因是,mssql所依赖的promise包不会为它的回调函数带来上下文。