使用 sequelize 可以进行 TRANSACTION 吗?
Posted
技术标签:
【中文标题】使用 sequelize 可以进行 TRANSACTION 吗?【英文标题】:Is TRANSACTION possible using sequelize? 【发布时间】:2012-02-20 13:52:12 【问题描述】:我使用的脚本首先将所有行的状态设置为 0,然后将某些行的状态单独设置为不同的值。每分钟执行一次。我已经多次注意到我可以在我的数据库上执行 SELECT 并得到完全不正确的结果,因为我的许多或所有行都有 0 状态。这似乎是每分钟一秒的间隔,SELECT 将获得不正确的数据。
我曾考虑过使用 sequelize QueryChainer
,但这仍然不够,因为在链接器执行此操作时,选择查询很容易获取一些不正确的数据。
所以我想知道 sequelize 是否有一种方法可以确保我的所有查询都被阻止并立即发送,因为我猜它没有实际的 TRANSACTION 支持。
【问题讨论】:
【参考方案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() 执行它们。以上是关于使用 sequelize 可以进行 TRANSACTION 吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 sequelize 通过相同两个表之间的单独联结表进行查询