我正在使用的脚本首先将我所有行的状态设置为0,然后分别将某些行的状态设置为不同的值。这是每分钟完成一次。我已经多次注意到我可以在我的数据库上执行SELECT并获得完全不正确的结果,因为我的许多或所有行都具有0状态。这似乎是每分钟一秒的间隙,其中SELECT将获得不正确的数据。
我曾想过使用sequelize QueryChainer
,但这仍然不够,因为选择查询可以轻松获取一些不正确的数据,而chainer正在做这件事。
所以我想知道sequelize是否有一种确保我的所有查询都被保留并立即发送的方法,因为我猜它没有实际的TRANSACTION支持。
答案 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
})
希望有所帮助