我有一个intervals表,用于存储变量的start日期和end日期variable_id(四列:)id, start, end, variable_id。
客户端计算一个变量的新间隔并将它们存储在该表中。为了保持一致性(对于variable_id我不想间隔重叠),客户端首先检查(select),我们有什么样的时间间隔,然后insert,delete和/或update相应的(或者什么都不做)。
如果两个客户同时这样做,当然会有我插入重叠间隔的风险,这是我不想要的。
其实我的问题很简单:我该怎么办?
似乎 aSELECT .. FOR UPDATE不起作用,因为这会锁定现有的行,这对我来说还不够,因为可能会插入行。我宁愿需要“ SELECT * FROM intervals WHERE variable_id = 1234”的结果在某种程度上是“安全的”。
我已经实现了一个使用SERIALIZABLE事务的解决方案。结果是,如果两个客户端输入这个 select/update-delete-insert 事务,一个将失败(could not serialize access due to read/write dependencies among transactions或could not serialize access due to concurrent update),在这种情况下,我只需要再次运行我的 select/update-delete-insert 逻辑以尝试插入更合适的间隔.
这里的问题是serializable事务似乎锁定了整个表。但是如果一个客户端想要更新变量1234的间隔,而另一个客户端想要更新变量4321的,应该没有问题,两个事务应该能够愉快地运行。
我不是 SQL 专家,甚至无法确定这是一个简单的经典 sql 问题还是一个难题。 …