Ruby on rails “每笔交易的最大锁数”能否增加到非常大的数额?

Ruby on rails “每笔交易的最大锁数”能否增加到非常大的数额?,ruby-on-rails,postgresql,Ruby On Rails,Postgresql,我有一个rake任务,它正在我的rails4.2应用程序的整个数据集上进行一些转换。当然,我希望将每个步骤包装在ActiveRecord::Base.transaction中,以便在出现错误时回滚整个步骤 但是在ActiveRecord::Base.transaction中执行的SQL语句的数量是巨大的,我从postgres中得到了错误: PG::OutOfMemory: ERROR: out of shared memory HINT: You might need to increase

我有一个rake任务,它正在我的rails4.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.
是否可以将每个事务的最大锁数增加到任意大的数值?想必,这其中一定有我不想接近的上限


或者,有没有更好的方法来执行大量操作,如果抛出异常,这些操作都会被撤消?

在某个时候,服务器会拒绝启动,因为内核不会像PostgreSQL所要求的那样移交那么多的共享内存。您可以将每个事务的最大锁数增加到该点,减去1。或者,您可以更改内核的共享内存设置,以便可以进一步增加每个事务的最大锁数。当然,这也会有一些限制,但这取决于我们不知道的操作系统和/或硬件的细节

但你为什么要这么做?您是否打开了无限数量的子串操作,却从未关闭它们

当然,我希望将每个步骤包装在ActiveRecord::Base.transaction中,以便在出现错误时回滚整个步骤

或者有没有更好的方法来执行大量的操作,如果抛出异常,这些操作都会被撤消


您想要哪一个,每一个步骤回滚,还是整个多步骤回滚?如果您希望整个事务回滚,那么您希望将所有事务都回滚到一个事务中。

在某个时候,服务器会拒绝启动,因为内核不会移交PostgreSQL所需的那么多共享内存。您可以将每个事务的最大锁数增加到该点,减去1。或者,您可以更改内核的共享内存设置,以便可以进一步增加每个事务的最大锁数。当然,这也会有一些限制,但这取决于我们不知道的操作系统和/或硬件的细节

但你为什么要这么做?您是否打开了无限数量的子串操作,却从未关闭它们

当然,我希望将每个步骤包装在ActiveRecord::Base.transaction中,以便在出现错误时回滚整个步骤

或者有没有更好的方法来执行大量的操作,如果抛出异常,这些操作都会被撤消


您想要哪一个,每一个步骤回滚,还是整个多步骤回滚?如果您希望整个事务回滚,那么您希望在一个事务中完成所有事务。

如果您已经尝试过调整每个事务的最大锁数,那么听起来您的数据可能太大,无法在单个事务中执行这些更改。我强烈建议不要将每个事务的max_locks_增加到任意高的数字,否则会打开内存不稳定的大门。在DBA堆栈交换中,您可能会更幸运地找到建议。可能与此相关:如果您已经尝试过调整每个事务的max_locks_,那么听起来您的数据可能太大,无法在单个事务中执行这些更改。我强烈建议不要将每个事务的max_locks_增加到任意高的数字,否则会打开内存不稳定的大门。在DBA堆栈交换上,您可能会更幸运地找到建议。可能相关:我正在将大约100000条记录迁移到一组全新的表中,每条记录都有十几条相关记录。现在,在我的本地机器上,在出现内存错误之前,我只能执行大约200次。因此,我正在寻找一种比我现在所做的内存效率高50倍的解决方案。我开始得出这样的结论:事务不会成为我的解决方案,这仅仅是因为我的问题规模太大。单个行不会被锁定在共享内存中。您可以更新/插入100000000行,并且它不需要比更新10行更多的共享内存锁,只要它们涉及同一组表。主要是表和索引占据了锁表,它们中有多少行无关紧要。我正在将大约100000条记录迁移到一组全新的表中,每条记录都有十几条相关记录。现在,在我的本地机器上,在出现内存错误之前,我只能执行大约200次。因此,我正在寻找一种比我现在所做的内存效率高50倍的解决方案。我开始得出这样的结论:事务不会成为我的解决方案,这仅仅是因为我的问题规模太大。单个行不会被锁定在共享内存中。您可以更新/插入100000000行,并且它不需要比更新10行更多的共享内存锁,只要它们涉及同一组表。主要是表和索引占据了锁表,它们中有多少行无关紧要。还有别的事情。