PostgreSQL:SET LOCAL警告解决及lock_timeout生效方法咨询
解决PostgreSQL中SET LOCAL lock_timeout的警告与生效问题
问题根源
SET LOCAL是事务级别的设置,必须在事务块(BEGIN到COMMIT/ROLLBACK区间)内执行才会生效。你在事务外执行它,虽然返回SET但实际没有任何效果,还会触发警告。
两种有效解决方案
方案1:仅对单个事务生效(用SET LOCAL)
把SET LOCAL放到事务内部,这样当前整个事务都会应用10秒锁超时,且不会触发警告:
BEGIN; SET LOCAL lock_timeout = 10000; -- 事务内执行,仅当前事务生效 LOCK TABLE person; -- 超过10秒会自动终止并报错 -- 可在此执行其他需要锁的操作 COMMIT; -- 事务结束后,该设置自动失效
方案2:对当前会话所有后续事务生效(用SET,不带LOCAL)
如果希望当前psql会话里的所有后续事务都默认使用10秒锁超时,直接用会话级的SET命令:
SET lock_timeout = 10000; -- 会话级设置,无警告,后续所有事务都生效 -- 之后的任意事务都会继承这个设置 BEGIN; LOCK TABLE person; -- 同样会触发10秒超时 COMMIT; BEGIN; UPDATE person SET name = 'test' WHERE id = 1; -- 涉及锁的操作也会遵循10秒超时 COMMIT;
关键区别
SET LOCAL:仅对当前所在的事务有效,事务结束即失效,适合临时给单个事务加超时限制的场景。SET(不带LOCAL):对当前整个数据库会话有效,只要会话不关闭,后续所有事务都会沿用这个设置,适合全局统一超时的场景。
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

