开启读写分离后,用户查询将会被发送到主节点或只读节点。如果希望一个符合负载均衡条件的 SQL 在开启读写分离后不被负载均衡、继续发送到主节点,可以采用在 SQL 前加 hint 的方式,通常使用 /*NO LOAD BALANCE*/
。
INSERT
,UPDATE
,DELETE
,COPY FROM
,TRUNCATE
,CREATE
,DROP
,ALTER
,COMMENT
SELECT ... FOR SHARE | UPDATE
DECLARE
,FETCH
,CLOSE
SHOW
比 ROW EXCLUSIVE MODE
更严格的 LOCK
命令
在事务隔离级别 SERIALIZABLE
中的 SELECT
部分事务性命令:
BEGIN READ WRITE
,START TRANSACTION READ WRITE
SET TRANSACTION READ WRITE
,SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE
SET transaction_read_only = off
两阶段提交命令:PREPARE TRANSACTION
,COMMIT PREPARED
,ROLLBACK PREPARED
LISTEN
,UNLISTEN
,NOTIFY
VACUUM
大对象创建命令
多语句查询(multiple SQL commands on single line)
一些序列方法(nextval and setval)
当前版本默认定义了一些函数和 SQL 模板,包含这些函数或者匹配上 SQL 模板的查询会转发到主节点。
包含 nextval
,setval
,lastval
,currval
,txid_current
,gin_clean_pending_list
函数的查询
包含以 pg_catalog
,pg_
,current_
,cursor_
作为前缀的函数的查询
符合查询模板 .*for update.*
的查询
不包含在上述的 SELECT
查询
COPY TO STDOUT
EXPLAIN
EXPLAIN ANALYZE and the query is SELECT not including writing functions
SET
DISCARD
DEALLOCATE ALL
在显示事务中,BEGIN
会被同时转发到主节点和只读节点。
在显式事务中,遇到不能在只读节点执行的查询语句(如 INSERT
)之前的查询语句,会发送到只读节点。
在显式事务中,遇到不能在只读节点执行的查询语句(如 INSERT
),会发送到主节点。在这之后的查询语句都会发送到主节点上,这是为了让 SELECT
立即看到 INSERT
的结果。 此行为一直持续到事务关闭或终止。