Sequelizejs:如何将事务与原始查询一起使用

Sequelizejs: how to use transactions along with raw queries

我正在使用 sequelize orm。我在他们的文档中找不到如何在使用原始查询时使用事务。我所看到的只是模型定义的查询方法。但是对于原始查询,没有关于将事务对象放置在何处以用于该特定查询的规范。

query method docs

您可以这样传递交易:

const t = await sequelize.transaction();

sequelize.query('SELECT * FROM table;', { transaction: t })

请参阅 transactions docs 了解定义交易的不同方式。

上面的link对我没有帮助,但是已经想出了解决办法: (如果您在 catch 块中回滚,事务将被还原。)

  sequelize.transaction(async transaction => {
    try {
      await sequelize.query(
        `
        UPDATE Balances
        SET amount = @amount := amount - 
        WHERE userId=`,
        {
          type: Sequelize.QueryTypes.UPDATE,
          transaction,
          raw: true
        },
      )

      await sequelize.query(
        `
        UPDATE Balances
        SET amount = @amount := amount - 
        WHERE userId=`,
        {
          type: Sequelize.QueryTypes.UPDATE,
          transaction,
          raw: true
        },
      )

    } catch (error) {
      transaction.rollback();
      throw `TRANSACTION_ERROR`;
    }
  })

还在看的小伙伴,用这个: 我们需要在最后提交交易。

const t = await sequelize.transaction();

try{
  await sequelize.query('SELECT * FROM table;', { transaction: t })
  await t.commit();
}
catch (e) {
 await t.rollback();
}

请查看此处的文档:https://sequelize.org/master/manual/transactions.html