环境:Oracle 12.2.0 RAC三节点,运行在VMware ESX虚拟平台,三个节点分别在三个物理机上
问题:开发有一个session循环插入差不多15万数据,每执行一条都提交,另外还有一个Daemon session不断检查插入的记录数,当检查完成时通知另外一个节点的session处理一个insert select语句,查询循环插入的那张表,会出现最后几条丢失的现象。
问题分析:研究RAC Commit的过程中发现下面这个BOC机制的介绍:
从Oracle 10gR2开始默认使用immediate commit propagation (BOC),即一个节点上的commit SCN 立刻同步/传播到所有节点(受隐含参数_immediate_commit_propagation控制,默认为true)。
immediate commit propagation (BOC)的原理如下:
1. user session 执行提交(commit),user session会通知LGWR进程将redo buffer中的信息写入到redo log file。
2. LGWR进程收到user session通知后,将redo buffer中的信息写入redo log file,同时LGWR进程 将COMMIT SCN 同步/传播给远程的数据库实例的LMS进程。
3. 远程数据库实例的LMS将commit SCN同步到本地SCN,然后通知commit实例的LMS进程,表示SCN 同步已经完成。
4. 当commit 实例的LMS进程接收到所有远程数据库实例的LMS进程的通知后,commit 实例的LMS进程再通知本地的LGWR 所有节点SCN同步已经完成。
5. LGWR进程在完成了IO 操作和LMS进程通知后,LGWR进程通知user session commit 成功。user session在没有收到LGWR进程通知前,一直处于等待log file sync。
首先想确认一下这个过程是否正确?假设正确的话,那么在第1步执行完毕后数据已经提交,如果第3步commit实例的LMS进程没有收到远程数据库实例的LMS进程通知,这中间是不是有一个时间差,导致在commit实例查询出来的数据和远程实例查出来的不一致呢?
谢谢解惑!