与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
状态