使用 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 进行集成测试

使用 sequelize 通过相同两个表之间的单独联结表进行查询

如何使用带有 Sequelize 的 EXISTS 子句进行查询?

使用sequelize对数据库进行增删改查

sequelize 学习之路

Sequelize 检查表为空