postgresql并发查询调试

时间:2013-08-01 14:08:37

标签: multithreading postgresql locking plpgsql

有一个多线程应用程序执行一些PL / pgsql函数。该函数为极其重要的资源(表)生成记录插入。它还在执行时执行一些select / update / etc操作。

问题是,有时我们会遇到重复的(2-3)记录,每个记录在并行线程中传递给函数。并且它们都作为函数执行结果插入到表中,而它们不应该。

它发生了,因为两个事务都是并行执行的,并且不知道正在准备在并行事务中插入相同的记录。

该表极为重要,各种LOCK TABLE都非常受欢迎(LOCK FOR SHARE MODE同时给出了一些有用的经验。)

所以,问题是,是否有任何最佳实践如何组织PL / pgsql函数使用多线程应用程序执行的关键资源(表)并且不会对此资源产生有害锁定?

PS。我知道,应用程序中的record.ID部分线程是一个可能的解决方案。但是I.m首先对PL / pgsql解决方案感兴趣。

1 个答案:

答案 0 :(得分:2)

有时你可以使用咨询锁 - http://www.postgresql.org/docs/current/static/explicit-locking.html。这些锁定了一些数字子集。我用它来成功同步并行插入。