关于事务的注意事项

请注意,Sequelize 中的许多模型操作允许你在方法的 options 参数中指定事务. 如果在原始调用中 指定 了一个事务,它将出现在传递给 hook 函数的 options 参数中. 例如,请参考以下代码段:

  1. // 这里我们使用异步 hook 的 promise 风格,而不是回调.
  2. User.addHook('afterCreate', (user, options) => {
  3. // 'transaction' 将在 options.transaction 中可用
  4. // 此操作将成为与原始 User.create 调用相同的事务的一部分.
  5. return User.update({
  6. mood: 'sad'
  7. }, {
  8. where: {
  9. id: user.id
  10. },
  11. transaction: options.transaction
  12. });
  13. });
  14. sequelize.transaction(transaction => {
  15. User.create({
  16. username: 'someguy',
  17. mood: 'happy',
  18. transaction
  19. });
  20. });

如果我们在上述代码中的 User.update 调用中未包含事务选项,则不会发生任何更改,因为在已提交挂起的事务之前,我们新创建的用户不存在于数据库中.

内部事务

要认识到 sequelize 可能会在某些操作(如 Model.findOrCreate)内部使用事务是非常重要的. 如果你的 hook 函数执行依赖对象在数据库中存在的读取或写入操作,或者修改对象的存储值,就像上一节中的例子一样,你应该总是指定 { transaction: options.transaction }.

如果在处理操作的过程中已经调用了该 hook ,则这将确保你的依赖读/写是同一事务的一部分. 如果 hook 没有被处理,你只需要指定{ transaction: null } 并且可以预期默认行为.