Sequelize 支持两种使用事务的方式:

  1. 非托管事务: 提交和回滚事务应由用户手动完成(通过调用适当的 Sequelize 方法).
  2. 托管事务:
    1. 如果引发任何错误,Sequelize 将自动回滚事务,否则将提交事务.
    2. 另外,如果启用了CLS(连续本地存储), 则事务回调中的所有查询将自动接收事务对象.

非托管事务

  1. // 首先,我们开始一个事务并将其保存到变量中
  2. const t = await sequelize.transaction();
  3. try {
  4. // 然后,我们进行一些调用以将此事务作为参数传递:
  5. const user = await User.create({
  6. firstName: 'Bart',
  7. lastName: 'Simpson'
  8. }, { transaction: t });
  9. await user.addSibling({
  10. firstName: 'Lisa',
  11. lastName: 'Simpson'
  12. }, { transaction: t });
  13. // 如果执行到此行,且没有引发任何错误.
  14. // 我们手动提交事务.
  15. await t.commit();
  16. } catch (error) {
  17. // 如果执行到达此行,则抛出错误.
  18. // 我们回滚事务.
  19. await t.rollback();
  20. }

托管事务

  1. try {
  2. const result = await sequelize.transaction(async (t) => {
  3. const user = await User.create({
  4. firstName: 'Abraham',
  5. lastName: 'Lincoln'
  6. }, { transaction: t });
  7. await user.setShooter({
  8. firstName: 'John',
  9. lastName: 'Boothe'
  10. }, { transaction: t });
  11. return user;
  12. });
  13. // 如果执行到此行,则表示事务已成功提交,`result`是事务返回的结果
  14. // `result` 就是从事务回调中返回的结果(在这种情况下为 `user`)
  15. } catch (error) {
  16. // 如果执行到此,则发生错误.
  17. // 该事务已由 Sequelize 自动回滚!
  18. }

defaultScope作用域

作用域在模型 Model中定义,可以是查找器对象,也可以是返回查找器对象的函数
默认作用域除外,该作用域只能是一个对象

  1. class UserModel extends Model { }
  2. UserModel.init({
  3. // 属性
  4. }, {
  5. defaultScope: { // 默认作用域
  6. where: {
  7. active: true
  8. }
  9. },
  10. scopes: {
  11. deleted: {
  12. where: {
  13. deleted: true
  14. }
  15. },
  16. activeUsers: {
  17. include: [
  18. { model: User, where: { active: true } }
  19. ]
  20. },
  21. random() {
  22. return {
  23. where: {
  24. someNumber: Math.random()
  25. }
  26. }
  27. }
  28. },
  29. sequelize,
  30. modelName: 'user'
  31. });
  32. // 用法就是调用scope方法传入字符串,返回一个查询对象
  33. await UserModel.scope('deleted').findAll();
  34. SELECT * FROM user WHERE deleted = true // sql
  35. await UserModel.scope('random', { method: ['accessLevel', 19] }).findAll();
  36. SELECT * FROM user WHERE someNumber = 42 AND accessLevel >= 19;