【问题标题】:Sequelize CLS transaction not usedSequelize CLS 事务未使用
【发布时间】:2015-06-03 19:03:41
【问题描述】:

我正在尝试使用持续本地存储支持为所有嵌套的 sequelize 查询实现全局事务。我相信我已经正确地将命名空间设置为 Sequelize.cls,因为它可以在许多地方按预期工作。

当将数据从 SQL 服务器迁移到 Postgresql(序列化模型绑定)时,嵌套调用不使用事务。代码如下。

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.IlIce 方法中。在此方法上下文中, Sequelize.cls.get('transaction') 返回未定义。

【问题讨论】:

    标签: transactions sequelize.js


    【解决方案1】:

    显然它根本与 sequelize.js 无关。问题的原因是mssql所依赖的promise包没有携带上下文到它的回调函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 2016-04-21
      • 1970-01-01
      • 2018-02-09
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多