【问题标题】:Checking for transactions in Sequelize在 Sequelize 中检查交易
【发布时间】:2021-02-06 06:09:00
【问题描述】:

在 Sequelize 中,您可以:

  • 手动将事务作为第二个参数传递给每个查询
  • 或者使用 CLS 自动将事务传递给所有查询。

我想使用手动选项,但我想更改默认模型行为,以便在未提供事务时查询将引发错误。可选的noTransaction 参数将允许您绕过事务检查。

myModel.update({newValue: true}); // throws Error "No transaction specified"
myModel.update({newValue: true}, {transaction}); // OK
myModel.update({newValue: true}, {noTransaction: true); // OK

在 Sequelize 中更新模型方法的默认行为的最佳方法是什么?

【问题讨论】:

    标签: sequelize.js


    【解决方案1】:

    事实证明这很简单,因为 Sequelize 支持向所有模型添加挂钩:

    sequelize.addHook('beforeCreate', checkForTransaction);
    sequelize.addHook('beforeUpdate', checkForTransaction);
    sequelize.addHook('beforeDestroy', checkForTransaction);
    
    function checkForTransaction (data, options) {
      if (!options.transaction && !options.noTransaction) {
        throw new Error('Transaction is required');
      }
    }
    

    【讨论】:

      【解决方案2】:

      实际上,我认为最好的解决方案是根本不手动创建事务。而是让装饰者为您完成工作。

      function start() {
          try {
            const transaction = sequelize.transaction();
      
            // allowing me to pass it to multiple functions.
            foo(transaction);
            bar(transaction);
      
            transaction.commit();
          } catch(err) {
            transaction.rollback();
            throw err;
          }
      }
      

      变短了

      @Transactional
      function start(@Tx transaction) {
        foo(transaction);
        bar(transaction);
      }
      

      transaction 参数变为可选参数,并在必要时自动初始化。它基本上允许所有方法单独执行或作为更大事务的一部分执行。而且您永远不必为它编写代码。

      这需要package:

      npm install zb-sequelize
      

      您必须授予它访问您的 sequelize 实例的权限。

      import { initSequelizeResolver } from 'zb-sequelize';
      initSequelizeResolver((args) => sequelize);
      

      【讨论】:

        猜你喜欢
        • 2019-02-14
        • 2015-11-02
        • 1970-01-01
        • 2020-03-05
        • 1970-01-01
        • 2015-02-27
        • 2018-09-21
        • 2017-08-22
        • 2016-01-22
        相关资源
        最近更新 更多