TRANSACTION可以使用sequelize吗?

时间:2012-01-27 15:19:59

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

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

我曾想过使用sequelize QueryChainer,但这仍然不够,因为选择查询可以轻松获取一些不正确的数据,而chainer正在做这件事。

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

2 个答案:

答案 0 :(得分:11)

截至提交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 () { ... });
};

答案 1 :(得分: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
})

希望有所帮助