我有一个瑞克任务,正在对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
增加到任意数量?大概必须有一些我不想处理的上限。
还是有更好的方法来执行大量操作,如果一个人抛出异常,这些操作都将被撤消?
答案 0 :(得分:1)
在某个时候,服务器将拒绝启动,因为内核不会交出PostgreSQL所需的共享内存。您可以将max_locks_per_transaction增加到负1。或者可以更改内核的共享内存设置,以便可以进一步增加max_locks_per_transaction。当然,这也会有一些限制,但是它取决于我们不知道的操作系统和/或硬件的详细信息。
但是您为什么需要这样做?您是否在打开无限数量的子交易并且从不关闭它们?
自然地,我想将每个步骤包装在ActiveRecord :: Base.transaction中,以便在发生错误时将整个步骤回滚。
还是有更好的方法来执行大量操作,如果一个人抛出异常,这些操作都将被撤消?
您想要哪个,回退每个步骤,或回滚整个多步骤?如果您希望整个过程都回滚,那么您希望一次完成所有操作。