小编Art*_*hur的帖子

并发选择条件插入/更新/删除 - PostgreSQL

我有一个intervals表,用于存储变量的start日期和end日期variable_id(四列:)id, start, end, variable_id

客户端计算一个变量的新间隔并将它们存储在该表中。为了保持一致性(对于variable_id我不想间隔重叠),客户端首先检查(select),我们有什么样的时间间隔,然后insertdelete和/或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 transactionscould not serialize access due to concurrent update),在这种情况下,我只需要再次运行我的 select/update-delete-insert 逻辑以尝试插入更合适的间隔.

这里的问题是serializable事务似乎锁定了整个表。但是如果一个客户端想要更新变量1234的间隔,而另一个客户端想要更新变量4321的,应该没有问题,两个事务应该能够愉快地运行。

我不是 SQL 专家,甚至无法确定这是一个简单的经典 sql 问题还是一个难题。 …

postgresql concurrency

5
推荐指数
1
解决办法
2481
查看次数

标签 统计

concurrency ×1

postgresql ×1