mysql读写分离下如何读取最新数据_利用事务路由或强制走主库

酷伟酱_9320

酷伟酱_9320

2026-04-13

422人浏览

原创

从库查不到刚写入的数据是因主从复制延迟导致的最终一致性表现。INSERT/UPDATE后立即从从库SELECT可能为空,需通过SQL Hint、注解或事务内读写同库等方式强制走主库。

mysql读写分离下如何读取最新数据_利用事务路由或强制走主库

为什么从库查不到刚写入的数据

MySQL 读写分离后,写操作落在主库,读操作默认路由到从库;但主从复制有延迟(即使毫秒级),INSERT 或 UPDATE 提交后立刻在从库 SELECT,很可能查不到或查到旧值。这不是 bug,是最终一致性模型的必然表现。

常见错误现象:INSERT INTO orders ...; SELECT * FROM orders WHERE id = LAST_INSERT_ID(); 在从库执行时返回空——因为 binlog 还没同步过去。

  • 复制延迟受网络、从库负载、大事务影响,无法完全消除
  • 半同步复制能降低延迟,但不保证实时
  • 应用层不做控制时,框架(如 MyBatis Plus 多数据源)或中间件(ShardingSphere、Atlas)通常默认走从库

强制走主库的三种实操方式

核心思路:绕过读写分离中间件/代理的自动路由逻辑,显式指定查询发往主库。具体方法取决于你用的架构层级。

  • 如果用的是 ShardingSphere-JDBC:在 SQL 注释中加 /* sharding hint: write */,例如 /* sharding hint: write */ SELECT * FROM user WHERE id = 123;
  • 如果用的是 MyBatis + 自定义多数据源(如 AbstractRoutingDataSource):在 Service 方法上加自定义注解(如 @Master),并在 determineCurrentLookupKey() 中识别该标记,返回 "master" 数据源名
  • 如果直连 MySQL 且用 mysql-proxy 或 MaxScale:部分版本支持 SQL Hint,如 SELECT /*+ MAXSCALE route-to=master */ * FROM t;,需确认代理是否开启 hint 解析

注意:/* ... */ 注释必须紧贴 SELECT 开头,不能换行或有空格隔开,否则中间件可能无法识别。

Skill Weave Chains — 技能链路由引擎
Skill Weave Chains — 技能链路由引擎

开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。

下载

用事务保证读写同库的关键细节

在同一个事务中执行写和读,多数读写分离方案会将整个事务路由到主库(前提是事务未被拆分)。但这不是绝对的,依赖中间件行为。

  • Spring @Transactional 默认传播行为是 REQUIRED,只要不手动切数据源,事务内所有 JDBC 操作都会复用同一个连接——而连接来自主库数据源
  • 风险点:如果事务中调用了另一个被 @Slave 注解修饰的方法,或触发了动态数据源切换,连接可能被换掉,导致后续读走从库
  • 不要依赖“事务自动走主库”而不验证——建议在事务方法开头加日志,打印当前数据源名,或用 Connection.isReadOnly() 辅助判断
  • 长事务会占用主库连接,增加主库压力;非必要不把耗时查询塞进写事务里

什么场景下必须强制主库,什么可以接受延迟

不是所有“刚写完就查”都需要强一致。先判断业务语义:

  • 必须强一致:支付结果页查订单状态、后台审核后立即刷新详情、用户注册后跳转个人中心显示昵称
  • 可接受秒级延迟:商品销量计数、评论列表、运营后台的统计报表
  • 折中方案:对关键读请求加 SELECT ... FOR UPDATE(需在主库执行),既防止并发修改,又自然走主库;但会阻塞,慎用
  • 更轻量替代:写完后 SLEEP(0.1) 再查?不推荐——不可靠、难维护、掩盖问题本质

最易被忽略的一点:前端重定向(redirect after post)本身已天然规避了大部分刚写即读问题——因为浏览器发起新请求,此时主从延迟大概率已收敛;真正危险的是 AJAX 连续调用,且读接口没做主库路由。

相关文章

路由优化大师
路由优化大师

路由优化大师是一款及简单的路由器设置管理软件,其主要功能是一键设置优化路由、屏广告、防蹭网、路由器全面检测及高级设置等,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

mysql 路由

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2413

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1459

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

855

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

3392

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

5828

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1259

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

6091

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

5262

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

7074

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 193人学习