有一个多线程应用程序执行一些 PL/pgsql 函数。该函数生成对至关重要的资源(表)的记录插入。它还在执行时执行一些选择/更新/等操作。
问题是,有时我们会遇到重复的(2-3)记录,每个记录都传递给并行线程中的函数。并且它们都作为函数执行结果插入到表中,而它们不应该。
发生这种情况是因为两个事务是并行执行的,并且不知道准备在并行事务中插入相同的记录。
这张桌子非常重要,各种LOCK TABLE
都非常不受欢迎(LOCK FOR SHARE MODE
同时提供了一些有用的经验)。
所以,问题是,是否有任何最佳实践如何组织 PL/pgsql 函数与要由多线程应用程序执行的关键资源(表)一起工作,并且不会在该资源上产生有害锁?
PS。我知道,在应用程序中通过 record.ID 进行一些线程分区是一种可能的解决方案。但我首先对 PL/pgsql 解决方案感兴趣。