問題描述
在使用postgres執行一個存儲過程,存儲過程的操作是對全庫上百張表添加字段,執行到一半的時候拋出了錯誤:You might need to increase max_locks_per_transaction。
原因
因為一個過程中操作的表過多,超過了最大對象鎖的限制數量,導致了異常。
大意是開啟事務后,每次操作一張表,會進行一次表級的lock操作,並增加lock的大小,當lock的大小超過了默認的限定值,就會拋出異常。
postgres中默認max_locks_per_transaction大小是64
官方對此的解釋:
共享鎖表跟蹤在max_locks_per_transaction * (max_connections + max_prepared_transactions) 個對象(如表)上的鎖。
因此,在任何一個時刻,只有不超過這么多個可區分對象能夠被鎖住。這個參數控制為每個事務分配的對象鎖的平均數量。
個體事務可以鎖住更多對象,數量可以和鎖表中能容納的所有事務的鎖一樣多。這不是能被鎖住的行數,那個值是沒有限制的。
默認值 64 已經被歷史證明是足夠的,但是如果你有需要在一個事務中使用很多不同表的查詢(例如查詢一個有很多子表的父表),你可能需要提高這個值。這個參數只能在服務器啟動時設置。
當運行一個后備服務器時,你必須設置這個參數為大於等於主服務器上的值。否則,后備服務器上將不允許查詢。
解決方案
1、修改配置文件,../data/postgresql.conf,將參數重新配置:max_locks_per_transaction = 1024,然后重啟數據庫即可
2、減少過程中操作表的數量,即將一個大的存儲過程拆分成若干小過程,再進行執行,最終我們采用的是這個方法,因為根據官方的描述,默認配置是經過驗證最合理的配置,將配置調大可能會產生未知的風險
————————————————
參考鏈接:https://blog.csdn.net/wtopps/article/details/78554796
http://www.postgres.cn/docs/9.5/runtime-config-locks.html