我有一个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 问题还是一个难题。 …