【发布时间】:2013-07-08 08:58:33
【问题描述】:
我在 Windows 环境中使用 PostgreSQL 9.2。 我在使用 MSDTC 的 2PC (2 phase commit) 环境中。
我有一个客户端应用程序,它在 SERIALIZABLE 隔离级别启动事务,在表中为特定的外键值插入新的数据行(列上有一个索引),并投票完成交易(交易已准备好)。事务将由事务协调器提交。
紧接着,在事务之外,同一个客户端向所有行请求这个相同的特定外键值。
因为在前一个事务真正提交之前可能存在延迟,所以 SELECT 子句可能会返回数据的先前快照。事实上,它确实有时会发生,这是有问题的。当然,应用程序可能会重新设计,但在那之前,我正在寻找锁定解决方案。咨询锁?
我已经在对特定行执行 UPDATE 时解决了这个问题,然后使用 SELECT...FOR SHARE,它运行良好。 SELECT 等待事务提交并返回新旧行。
现在我正在尝试为 INSERT 解决它。 SELECT...FOR SHARE 不会立即阻塞并返回。
这里没有并发问题,因为只有一个客户端处理一组特定的行。我已经知道 MVCC。
任何帮助表示赞赏。
【问题讨论】:
-
你试过
SELECT...FOR UPDATE吗? -
@Denis 是的,同样的结果。
标签: postgresql insert locking 2phase-commit