pgsql报错:cannot execute ..... in a read-only transaction

 

 

原因:

    1. 事务模式设置:
      若在代码或客户端工具中,显式将事务设置为只读模式(如 START TRANSACTION READ ONLY; ),后续执行 DELETE 操作(会修改数据 ),就会触发该错误。常见于一些对数据库做只读查询的脚本、连接配置,误开只读事务后执行写操作。
    2. ** replication 环境影响 **:
      在 PostgreSQL 流复制环境中, standby 节点默认是只读的。若应用程序错误连接到 standby 节点执行 DELETE ,会因节点只读特性报错。比如应用配置数据库连接时,未区分主从节点,从库收到写操作就会触发此错误。
    3. 数据库级别的只读参数:
      若设置了数据库级别的只读参数(如通过 ALTER DATABASE dbname SET default_transaction_read_only = on; ),该数据库下新开启的事务默认只读,执行 DELETE 会失败。一般是运维操作失误,或为特定场景(如报表库 )设置只读后,应用未适配导致。
    4. 工具 / 中间件限制:
      某些数据库连接工具、中间件(如数据网关、ORM 框架 ),可能在连接数据库时自动设置只读事务,或因配置错误限制了写操作。比如 ORM 框架配置中,错误启用 “只读模式” 选项,所有事务默认只读,执行 DELETE 就报错。

解决方案:

    复制库为只读模式,进行修改操作要在主库执行。

posted @ 2025-06-11 17:02  oddsC  阅读(1159)  评论(0)    收藏  举报