【问题标题】:Sequelize Transactions and IncrementsSequelize 事务和增量
【发布时间】:2020-12-29 15:55:39
【问题描述】:

sequelize.transactionmodel.increment 有问题

我有这个简单的模型

class Wallet extends Model {}

Wallet.init(
  {
    // Model attributes are defined here
    id: {
      type: DataTypes.INTEGER.UNSIGNED,
      autoIncrement: true,
      primaryKey: true,
      allowNull: false,
    },
    availableBalance: {
      type: DataTypes.FLOAT,
      allowNull: false,
      defaultValue: 0,
    },
  }
);

我试着做:

const wallet = await Wallet.findById(1);
await sequelize.transaction(async t => {
      //more sentences
      wallet.increment('availableBalance', { by: 1, transaction: t });
});

这是失败的:

错误:已为此调用了提交 交易(6de20ad2-ab57-4038-9003-fabff6437449),你不能再 使用它。

注意:事务里面有更多的句子,但我只留下了有冲突的那一行(增量句子)

有什么想法吗?

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

    您忘记等待异步increment 调用:

    const wallet = await Wallet.findById(1);
    await sequelize.transaction(async t => {
          //more sentences
          await wallet.increment('availableBalance', { by: 1, transaction: t });
    });
    

    【讨论】:

    • 天啊...我怎么能忘记这个!!!谢谢你..它工作;)
    • @Pipe 我建议也使用事务来获取wallet,否则在您调用wallet.increment() 时它可能会不同步。
    • 是的...我更喜欢使用事务回调,所以创建事务和提交事务是自动完成的。
    • 在这种情况下,让钱包实例超出交易范围没有任何问题。但建议在同一事务中使用相同的记录/模型或链接的记录/模型,以避免数据不一致
    • increment() 也确实会使用列值,但是如果您对同一行进行不同类型的更新,它可能会覆盖另一个进程写入的值(可能会添加一个功能未来某个时间),因此至少根据我的经验,使用相同的事务选择/更新以防止这些意外问题通常是一种很好的形式。
    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 2022-01-09
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 2017-10-21
    • 2015-06-03
    相关资源
    最近更新 更多