Если вы хотите предотвратить изменение таблицы при одновременных транзакциях, блокировка SHARE
будет правильной. Но это может привести к тупику, если две такие транзакции будут выполняться одновременно & mdash; каждая изменила несколько строк и блокируется другой, когда пытается увеличить блокировку таблицы.
Более того, все блокировки таблиц, конфликтующие с SHARE UPDATE EXCLUSIVE
, приведут к отмене автоочистки, что приведет к переполнению таблицы, когда это происходит слишком часто.
Так что держитесь подальше от настольных замков, они обычно неправильные.
Лучший способ сделать это - вообще не использовать явную блокировку, а использовать уровень изоляции SERIALIZABLE
для всех транзакций, которые обращаются к этой таблице.
Тогда вы можете просто использовать свой триггер (без блокировки), и никаких аномалий не может возникнуть. Если вы получили ошибку сериализации, повторите транзакцию.
Это сопровождается определенным снижением производительности, но допускает больше параллелизма, чем блокировка таблицы. Это также позволяет избежать проблем, описанных в начале.