如何在续集中锁定表,等到另一个请求完成

Piy*_*cha 5 node.js sequelize.js

描述:

我在db中有一个表说Table1.只有一列AppNo(numeric),只有一行,当前值是0

我在node.js使用SequelizeORM命名时创建了API UpdateAppNo.

每当UpdateAppNoapi调用值AppNo应该增加1.

我想要的是:

如果同时发出2个或更多同时请求,则当前请求应等到上一个请求完成.

现在发生了什么:

如果先前的请求正在进行中,则当前请求将引发错误.

And*_*son 20

这是旧的,但也是谷歌的第一个点击,所以我发布这个以防其他人在这里绊倒。

正如蔡斯所说,这根本没有很好的记录。这里有一些代码可以做你想做的事情......

const User = db.User

const t = await sequelize.transaction(async(t) => {
  const user = await User.findByPk(userId, {lock: true, transaction: t})
  user.fieldToIncrement++
  await user.save({transaction:t})
})
Run Code Online (Sandbox Code Playgroud)

关键点:

  1. 此代码示例使用 Sequelize 提供的“托管”事务,因此您不需要手动管理提交/回滚,但同样适用于非托管事务

  2. 您需要提供锁定选项以及事务,否则事务会在没有您正在寻找的锁定的情况下发生。在锁定时更新表行的请求将被阻止,直到锁被释放。

  3. 不要忘记将事务对象包含在事务上下文内任何数据库操作的选项中(请参阅对 user.save() 的调用),否则您的事务将自行停止...

我希望这对某人有帮助!


Cha*_*ase 9

这没有很好的文档或易于查找,但你想要的是一个包装你的查询查询的事务,它使用一个lock选项把它变成一个SELECT FOR UPDATE语句.

带有该lock选项的查询查询将锁定该行(您不需要锁定整个表),并且由于您正在使用事务,因此将根据您的实例是否持有锁来提交或回滚该操作.

您需要调整这些示例中的代码以供您使用.