插入数据到数据库,然后监听 binlog,从 binlog 拿新插入的 id 查询数据库,有可能会查不到吗?
参考下面的文章,这篇文章描述了该场景: https://www.git2get.com/av/109130438.html
并且工作中也确实遇到过一次(没有从库)。
上面的文章解释如下: 可以看到发起提交事务后主要经过 3 个阶段:
- redo 日志的 prepare 阶段,在这个阶段 innodb 会将 undo, redo 日志进行刷盘;
- binlog 的 prepare 和 commit 阶段,这里 binlog 的 prepare 其实什么也没有做,而在 commit 的时候刷新 binlog 到磁盘,在这个时候,其实事务是已经确定要提交了(无论后面是否发生宕机);
- redo 日志的 commit 阶段,这个时候会清除 undo 日志,把 redo 日志刷数据盘,也就是 mysql 的存储数据真正落库;
他认为第二步就写入了 binlog,此时 canal 可以获取到 binlog,但事务还未提交,因为第 3 步还没执行。
但是在我的理解中,数据是首先写到内存中的,并没有同步写入磁盘,第 3 步只是把 redo log 写入磁盘而已,不会同步写入数据到磁盘中(这里指写入 B+树中)。 所以,mysql 应该可以首先尝试从内存中获取,应该能获取到的吧。
求大佬解答