在读写分离的架构中,"写后立刻读"读不到数据是一个常见问题,原因是写操作是在主库完成的,而读操作是从库进行的,由于主从同步有延迟,从库数据可能未及时同步最新的写入操作,导致读不到刚写入的数据。
以下是几种解决方案:
一、方案 A
事务读(强制走主库)
对于一些对实时性要求高的读操作,如查询余额、查询额度等关键业务,可以通过 事务读 的方式强制走主库来确保读到最新的数据。这种方法保证了最新的写入在主库读取时是可见的,避免数据延迟问题。
实现方法:
在应用层控制关键的读操作(例如余额查询),强制直接从主库读取,而非从从库读取。
可以通过标记特定的查询走主库,比如使用数据库连接池中的读写分离策略:
主库:处理写和实时性要求高的读操作。
从库:处理普通读操作,减轻主库负载。
示例:
在 Golang 中可以通过代码逻辑来控制读操作是否走主库:
// 当写操作之后立刻需要读取,可以直接连接主库
func readFromMaster() {
dbMaster, _ := sql.Open("mysql", "master_dsn")
var result string
err := dbMaster.QueryRow("SELECT balance FROM accounts WHERE id = ?", accountID).Scan(&result)
if err != nil {
log.Fatal(err)
}
fmt.Println("Balance:", result)
}二、方案 B
数据库的强同步机制(MySQL MGR,Raft 或 Paxos 协议)
mysql 第8.14章 事务-读写分离,发现读不到数据