Sequelize+PostgreSQL:只读事务无法执行INSERT问题求助
问题排查思路
首先明确:Sequelize的原生query()方法不会自动解析SQL语句判断读写类型,默认会遵循连接池的路由规则。如果你的读写分离配置中默认路由到只读副本,那写操作的原生SQL就会触发只读事务报错,这就是你遇到的问题。
以下是具体排查方向:
强制指定主库连接:在原生查询的选项中添加
useMaster: true,强制走写库,比如:await sequelize.query('INSERT ... ON CONFLICT ...', { useMaster: true });直接测试这个修改,看生产环境是否还报错,这是最快验证路由问题的方式。
核对读写分离配置:检查
replication配置项,确认write指向的是可写的主库,read数组是只读副本。另外排查生产环境的数据库连接参数,有没有给读库设置readOnly: true属性,避免主从配置颠倒。检查事务上下文:如果原生查询是在事务中执行的,确认事务是基于主库连接开启的。如果事务绑定了只读连接,即使是写操作也会触发报错。可以通过
transaction.connection查看连接所属的库类型。验证路由规则逻辑:Sequelize的自动路由仅针对ORM方法(如
create/update走主库,findAll走读库),原生查询不会触发这个逻辑。所以所有需要写操作的原生SQL,都必须手动指定useMaster: true。排查版本兼容性:你使用的Sequelize 6.21.3版本,确认
useMaster选项在原生查询中是否正常生效。可以本地模拟生产环境的读写分离配置,复现问题后验证该选项的作用。
内容的提问来源于stack exchange,提问作者Rose
相关产品推荐
相关产品推荐

