只允许一行用于特定值,不允许其他行用于特定值

laik7k3q  于 2021-06-19  发布在  Mysql
关注(0)|答案(0)|浏览(207)

我有一个表可以跟踪批处理(不同表中的其他行)。该结构的简化版本如下:
id |类型|状态
可以有多种类型的批(针对不同的操作)和多种状态(打开、完成、失败等)。
业务逻辑意味着每个类型只能有0或1个打开的批,但可以有任意数量的非打开批。如果给定的批处理类型没有打开的批处理,则当该批处理类型的有效负载进入时,应自动创建一个新批处理。
逻辑的伪代码如下:

SELECT batch WHERE type = (requested batch type goes here) AND status = open
if (!batch exists) {
    INSERT INTO batch (requested batch type, open)
    SELECT last inserted batch
}
INSERT INTO payload (batch ID, payload data)

我们遇到的问题是一个很好的旧竞争条件,当没有开放批处理时,新有效负载的快速涌入可能会导致使用单个有效负载创建多个开放批处理,而实际上我们希望使用分配给该批处理的所有传入有效负载创建单个批处理。
有很多建议正在讨论中(锁表,使用一个额外的表来实现锁,等等),但是这些对我来说都有点不太优雅。我真正需要的是一个check约束,但是mysql不支持这些。事务似乎也不是一个解决方案,因为我们仍然得到相同的行为。
唯一的复合键也不是一个选项,因为对于每个批处理类型,它只允许每种状态类型中的一种。
有没有其他方法允许我每个类型只有一个打开的批,但有多个非打开的批?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题