与SQL服务器一起发生事务隔离级别问题

我们有一个具有Sequelize事务的函数。 在事务中,它检查数据库表行上的字段,并基于该字段返回或继续更新各种数据库表。

例如

let buyingStatus = await models.buyingFood.findOne({ where: { id: 21 }, transaction: t}); if (buyingStatus.status == 'bought') return 'already bought' 

如果继续,它会更新多个地方,只有在状态不被bought时才更新,最后将状态更改为bought

问题是当函数被同时调用两次时。 瓶颈是select语句后发生的更新。 所以两个人可以通过没有买的购买状态,然后更新bought状态,以及所有其他更新。

不是SQL的专家,我们研究发现,locking表或更改隔离级别可以解决这个问题。 但是,我们都执行并没有帮助。 见下文

1)改变隔离级别

 let t = await models.sequelize.transaction(isolationLevel: Sequelize.Transaction.ISOLATION_LEVELS.SERIALIZABLE); 

2)在查找上设置locking

 let buyingStatus = await models.buyingFood.findOne({ where: { id: 21 }, transaction: t, lock: t.LOCK.UPDATE }); 

我们想要的是从未提交的交易中读取,所以如果人A已经改变了他之前的bought状态