max_locks_per_transaction`可以增加很多吗?

时间:2019-11-28 16:04:39

标签: ruby-on-rails postgresql

我有一个瑞克任务,正在对Rails 4.2应用程序的整个数据集进行一些转换。当然,我想将每个步骤都包装在ActiveRecord::Base.transaction中,以便在出现错误时将整个步骤回退。

但是在ActiveRecord::Base.transaction中执行的SQL语句的数量巨大,而我从postgres中得到了错误:

PG::OutOfMemory: ERROR:  out of shared memory
HINT:  You might need to increase max_locks_per_transaction.

是否可以将max_locks_per_transaction增加到任意数量?大概必须有一些我不想处理的上限。

还是有更好的方法来执行大量操作,如果一个人抛出异常,这些操作都将被撤消?

1 个答案:

答案 0 :(得分:1)

在某个时候,服务器将拒绝启动,因为内核不会交出PostgreSQL所需的共享内存。您可以将max_locks_per_transaction增加到负1。或者可以更改内核的共享内存设置,以便可以进一步增加max_locks_per_transaction。当然,这也会有一些限制,但是它取决于我们不知道的操作系统和/或硬件的详细信息。

但是您为什么需要这样做?您是否在打开无限数量的子交易并且从不关闭它们?

  

自然地,我想将每个步骤包装在ActiveRecord :: Base.transaction中,以便在发生错误时将整个步骤回滚。

     

还是有更好的方法来执行大量操作,如果一个人抛出异常,这些操作都将被撤消?

您想要哪个,回退每个步骤,或回滚整个多步骤?如果您希望整个过程都回滚,那么您希望一次完成所有操作。