You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用flask-sqlalchemy时MaxScale未将读请求路由到从节点如何解决

问题根因

从你提供的MaxScale日志可以看到,ORM执行读请求时Autocommit: [disabled], trx is [open],SQLAlchemy默认会禁用自动提交,所有操作默认包裹在隐式事务中执行。而MaxScale的readwritesplit路由策略默认会将处于打开状态事务中的所有读请求路由到主节点,避免事务隔离级别导致的脏读问题,这就是原生开autocommit能正常路由到从节点、ORM请求全部走主的核心原因。

解决方案

方案1:全局开启自动提交(适合读一致性要求低的场景)

直接在Flask配置中给SQLAlchemy引擎开启全局自动提交,所有查询默认不在事务中执行,MaxScale会自动将读请求路由到从节点:

app.config["SQLALCHEMY_ENGINE_OPTIONS"] = {
    "autocommit": True,
    # 若使用mysql-connector-python驱动可换用以下配置,效果一致
    # "isolation_level": "AUTOCOMMIT"
}

注意:开启后所有写操作需要手动调用db.session.commit()才能生效。

方案2:单独拆分只读会话(更推荐,兼顾一致性和读写分离)

单独创建开启自动提交的只读会话,不影响原有写逻辑的事务一致性:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# 复用原有数据库连接URI,创建开自动提交的读引擎
read_engine = create_engine(
    app.config["SQLALCHEMY_DATABASE_URI"],
    execution_options={"autocommit": True}
)
ReadSession = sessionmaker(bind=read_engine)

# 封装上下文工具简化调用
def get_read_session():
    session = ReadSession()
    try:
        yield session
    finally:
        session.close()

读查询时使用该会话即可正常路由到从节点,ORM语法完全兼容:

with get_read_session() as session:
    users = session.query(User).join(...).filter(...).all()

方案3:修改MaxScale路由规则(无需改代码)

如果不想调整业务代码,可以直接修改MaxScale的readwritesplit配置,允许事务内的只读请求路由到从节点:

[Read-Write-Service]
type=service
router=readwritesplit
# 原有配置保留,新增以下参数
transactional_reads=on

注意:该方案需要确认你的业务允许事务内读存在少量延迟,避免因主从同步差导致读取不到刚写入的数据。

内容的提问来源于stack exchange,提问作者Sarvesh Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:06:05