0

有一个多线程应用程序执行一些 PL/pgsql 函数。该函数生成对至关重要的资源(表)的记录插入。它还在执行时执行一些选择/更新/等操作。

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

发生这种情况是因为两个事务是并行执行的,并且不知道准备在并行事务中插入相同的记录。

这张桌子非常重要,各种LOCK TABLE都非常不受欢迎(LOCK FOR SHARE MODE同时提供了一些有用的经验)。

所以,问题是,是否有任何最佳实践如何组织 PL/pgsql 函数与要由多线程应用程序执行的关键资源(表)一起工作,并且不会在该资源上产生有害锁?

PS。我知道,在应用程序中通过 record.ID 进行一些线程分区是一种可能的解决方案。但我首先对 PL/pgsql 解决方案感兴趣。

4

1 回答 1

2

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

于 2013-08-01T14:48:21.467 回答