mysql 第8.14章 事务-读写分离,发现读不到数据 mysql 第8.14章 事务-读写分离,发现读不到数据

9小时前

在读写分离的架构中,"写后立刻读"读不到数据是一个常见问题,原因是写操作是在主库完成的,而读操作是从库进行的,由于主从同步有延迟,从库数据可能未及时同步最新的写入操作,导致读不到刚写入的数据。

以下是几种解决方案:

一、方案 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 协议)




阅读 12

mysql文章
带到手机上看