【发布时间】:2017-03-22 18:34:48
【问题描述】:
我最近遇到了 postgres 并发错误,在此不再赘述。原始帖子可以在this link 找到。
我仍在努力更好地理解 postgres 如何处理可序列化并发。我的情况是这样的。我有一个存储过程,它读取一个表,然后根据读取的输出插入。这个存储过程,如果被多个客户端调用会导致 40001 读/写依赖异常。
问题是这样的。让我们假设读取一个表然后根据读取插入到其中的存储过程只读取一些行。如果保证每次调用 reads-insert 的存储过程都会触及 不同 行,并发异常会消失吗? postgres 是否足够聪明,可以跟踪在事务期间读取了哪些行,以便它可以准确地检测到不同事务对这些特定行的修改,从而导致异常?如果是,这种机制有多可靠?在某些情况下可以优化掉它吗?为了安全起见,postgres 会在修改任何读取表时抛出异常?
【问题讨论】:
-
为什么不将你的发现发送到 postgres 邮件列表?在那里您可以找到真正的专家以及最初编写代码的专家。 postgresql.org/list
-
“我有一个存储过程,它读取一个表,然后根据读取的输出插入。” 它是否“读取一个表”来确定是一行还是行存在吗?它读了多少表?
-
没有。事实上,读取跨越 3 个表需要一个中间联合/计数。这不是检查行是否存在并在不存在时插入的简单情况。这可以通过
insert的on conflict子句来处理。读取本身有一个涉及的WHERE子句,它将自动限制读取将触及的行数。
标签: database postgresql stored-procedures concurrency postgresql-9.5