发现是否正在由postgresql中的另一个事务插入另一条记录

时间:2018-03-14 18:12:02

标签: postgresql

想象一下,Postgresql中有一个开放的,正在进行的事务,插入记录并做其他事情。

BEGIN
  INSERT INTO films(id, name) VALUES(10, 'A comedy')
  # We are at this moment in time
  # The transaction is not yet committed
  # ...
COMMIT

是否有任何非阻止方式可以从此事务外部发现存在ID为10的正在进行的事务插入记录?

我能想到的唯一方法是:

BEGIN
SET statement_timeout to 100
INSERT INTO films(id, name) VALUES(10, '') ON CONFLICT (id) DO NOTHING
ROLLBACK
  • 如果我从INSERT获得超时而不是意味着还有另一个正在进行的交易
  • 如果我没有插入任何内容,那么现在已经完成了一项交易,并且发现了唯一ID的冲突
  • 如果INSERT成功然后我回滚而不是意味着现在没有事务尝试插入ID = 10的行

然而,这不太理想,因为:

  • 这不是非阻塞,我在这里等待100ms
  • 我正在进行INSERT操作,而我更喜欢只读解决方案
  • 据我所知,我正在积极地触发冲突,但我不能以任何简单的方式强制执行第二次交易失控并且我不会中断第一次交易的工作

我正在努力解决Postgresql中缺少READ UNCOMMITTED事务隔离级别的问题。

我负责代码的两个部分,因此我可以以任何必要的方式更改它们。

0 个答案:

没有答案