PostgreSQL中set_config函数与SET命令表现不一致问题咨询
问题原因分析
问题现象
执行以下SQL时,SET命令能正常修改会话变量,但set_config函数的修改无法持久:
select current_setting('my.session_id'); -- 输出: -- current_setting -- ----------------- -- 14 -- (1 row) select set_config ( 'my.session_id', 15::text , true) ; -- 输出: -- set_config -- ------------ -- 15 -- (1 row) select current_setting('my.session_id'); -- 输出: -- current_setting -- ----------------- -- 14 -- (1 row) set my.session_id = 15; -- 输出:SET select current_setting('my.session_id'); -- 输出: -- current_setting -- ----------------- -- 15 -- (1 row)
核心原因
差异来自两者的生效范围:
set_config函数的第三个参数true指定了仅当前事务生效:这个修改只在执行set_config的事务内有效,事务结束(比如自动提交完成)后,配置会立刻恢复为原有值。SET命令默认是会话级生效:修改会持续到整个数据库会话结束,直到你主动修改或断开连接。
你的客户端应该开启了自动提交(每条SQL语句单独作为一个事务执行),所以set_config的修改在语句执行完成后就失效了,而SET的修改会一直保留。
解决方法
如果想让set_config达到和SET命令一样的会话级效果,只需将第三个参数改为false:
select set_config('my.session_id', '15', false);
执行后,后续同会话内的current_setting查询都会返回15,直到你再次修改或断开会话。
内容的提问来源于stack exchange,提问作者Jayadevan
相关产品推荐
相关产品推荐

