
以上是目前比较主流的数据库架构:一主一备多从。
1.问题
由于主从可能存在延迟,客户端执行完一个更新事务后马上发起查询,如果查询选择的是从库的话,就有可能读到刚刚的事务更新之前的状态。
2.解决方案
(1)由业务开发自己评估,如果对主从延迟不敏感则读从库,如果对主从延迟敏感,则读主库,这个是平时使用较多的方案;
(2)等主库DTID方案:就是在主库执行完写操作之后会返回一个GTID,然后等从库执行完这个DTID之后再执行查询操作,方案的具体执行步骤如下:
trx1 事务更新完成后,从返回包直接获取这个事务的 GTID,记为 gtid1;
选定一个从库执行查询语句;
在从库上执行 select wait_for_executed_gtid_set(gtid1, 1);
如果返回值是 0,则在这个从库执行查询语句;
否则,到主库执行查询语句。