Postgres事务中current_setting是否全程一致?是否会被其他事务修改?
Postgres多事务下current_setting的隔离性说明
你完全不用担心不同事务之间会互相修改current_setting对应的变量,Postgres的机制从根本上保证了这类设置的隔离性,具体原因如下:
- session/事务级设置的独立性:通过
SET(session级)或SET LOCAL(事务级)设置的自定义变量,每个数据库连接(session)都有独立的存储空间。事务级设置仅在当前事务生命周期内有效,事务提交/回滚后自动恢复;session级设置则持续到连接断开或被重新覆盖,但仅对当前session内的事务生效。 - 并发事务的隔离边界:Postgres支持并发事务,但不同session的事务上下文完全隔离——甲session的事务设置不会被乙session的事务读取或修改。即使是同一个session内,事务也是串行执行的,前一个事务的设置不会干扰后一个事务(除非你在同一个事务内主动修改)。
针对你用current_setting实现RLS和应用用户认证的场景,这是Postgres生态中的常规实践,只要你在每个请求对应的session或事务中正确设置变量,就不会出现事务执行过程中变量被其他事务修改的情况。
举个典型的事务级设置示例:
BEGIN; -- 仅在当前事务内生效的用户设置 SET LOCAL app.current_user = 'alice'; -- 触发RLS的查询,会基于该变量过滤数据 SELECT * FROM user_data; COMMIT; -- 事务结束后,app.current_user恢复到之前的值
内容的提问来源于stack exchange,提问作者Nicky Schranz
相关产品推荐
相关产品推荐

