簡體   English   中英

`max_locks_per_transaction` 可以增加到非常大的數量嗎?

[英]Can `max_locks_per_transaction` be increased to a very large amount?

我有一個 rake 任務,它對我的​​ 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增加到任意大的數字? 據推測,必須有一些我不想接近的上限。

或者有沒有更好的方法來執行大量操作,如果拋出異常,這些操作都會被撤消?

在某些時候,服務器將拒絕啟動,因為內核不會交出 PostgreSQL 要求的那么多共享內存。 您可以將 max_locks_per_transaction 增加到那個點,減去 1。或者您可以更改內核的共享內存設置,以便您可以進一步增加 max_locks_per_transaction。 當然,這也有一些限制,但具體取決於您的操作系統和/或我們不知道的硬件的詳細信息。

但是你為什么需要這樣做呢? 您是否打開了無限數量的 substranactions 並且從不關閉它們?

自然,我想將每個步驟包裝在 ActiveRecord::Base.transaction 中,以便在出現錯誤時整個步驟都可以回滾。

或者有沒有更好的方法來執行大量操作,如果拋出異常,這些操作都會被撤消?

您想要哪一個,要回滾每個單獨的步驟,還是要回滾整個多步驟? 如果您希望整個事情都回滾,那么您希望在一個事務中全部完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM