【问题标题】:Is TRANSACTION possible using sequelize?使用 sequelize 可以进行 TRANSACTION 吗?
【发布时间】:2012-02-20 13:52:12
【问题描述】:

我使用的脚本首先将所有行的状态设置为 0,然后将某些行的状态单独设置为不同的值。每分钟执行一次。我已经多次注意到我可以在我的数据库上执行 SELECT 并得到完全不正确的结果,因为我的许多或所有行都有 0 状态。这似乎是每分钟一秒的间隔,SELECT 将获得不正确的数据。

我曾考虑过使用 sequelize QueryChainer,但这仍然不够,因为在链接器执行此操作时,选择查询很容易获取一些不正确的数据。

所以我想知道 sequelize 是否有一种方法可以确保我的所有查询都被阻止并立即发送,因为我猜它没有实际的 TRANSACTION 支持。

【问题讨论】:

    标签: javascript mysql node.js transactions sequelize.js


    【解决方案1】:

    从提交 cf8cd6eb769f2470b58c95e49114c05cdd1e3653(2013 年 11 月下旬)开始,Sequelize 现在支持事务。这最近在 npm(1.7.0 和 2.0.0 分支)中可用。 该 API 在pull request 中进行了描述。

    你需要这样的东西:

    sequelize.transaction(function(t) {
       Table.update({status: 0}, {}, { transaction: t });
       t.commit().success(function () { ... });
    };
    

    【讨论】:

    • 注意:我知道这个问题已有一年多的历史了,并且有一个公认的答案,但我认为它仍然对来自 Google 的人有所帮助。
    【解决方案2】:

    你是对的,目前没有交易支持。你的问题实际上听起来像你在做类似的事情:

    sequelize.query('UPDATE mytable SET expired=0').success(function() {
      Mytable.findAll(/* conditions */ ).success(function(entries) {
        entries.forEach(function(entry){ entries.updateAttributes({expired:1}) })
        Mytable.findAll().success(function(entries){
          // check status of entries
        })
      })
    })
    

    此代码会更新一些条目,但不会等待它完成。如果你有这样的东西,你应该使用 QueryChainer,像这样:

    var chainer = new Sequelize.Utils.QueryChainer
    
    entries.forEach(function(entry) {
      chainer.add(entry.updateAttributes({ expired: 1 }))
    })
    
    chainer.run().success(function() {
      // now go on here
    })
    

    如果您没有上述错误,并且想先收集所有操作,然后批量执行(并串行),请执行以下操作:

    var chainer = new Sequelize.Utils.QueryChainer
    
    entries.forEach(function(entry) {
      chainer.add(entry, 'updateAttributes', [{ expired: 1 }])
    })
    
    chainer.runSerially().success(function() {
      // now go on here
    })
    

    希望有帮助

    【讨论】:

    • 这是否会使SELECT 在 QueryChainer 工作时无法获取数据?
    • 澄清一下,我担心由于每个 UPDATE 都是单独运行的,SELECT 查询可能会在更新查询之间获取一些错误数据
    • 你能澄清一下吗? QueryChainer 中的所有操作是连续但单独执行的,还是实际上作为一个查询执行?我只是不希望 SELECT 语句能够在 QueryChainer 运行时获取数据,从而获取不正确的数据
    • 是的,查询只是串行执行的。但是您可以自己构建查询并使用 sequelize.query() 执行它们。
    猜你喜欢
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 2020-09-28
    • 2016-09-08
    相关资源
    最近更新 更多