SQL Server AlwaysOn中的脏读

时间:2016-09-19 13:05:11

标签: sql sql-server acid alwayson

我将一对SQL Server 2014数据库设置为同步AlwaysOn可用性组。

两台服务器都设置为Synchronous commit可用性模式,会话超时为50秒。辅助设置为Read-intent only可读的辅助。

如果我写入主服务器然后立即从辅助服务器读取(通过ApplicationIntent=ReadOnly),我会一直读取脏数据(即写入之前的状态)。如果我在写作和阅读之间等待大约一秒钟,我会得到正确的数据。

这是预期的行为吗?如果是这样,我能做些什么来确保来自辅助节点的读取是最新的吗?

我希望将辅助服务器用作主服务器的只读版本(以及故障转移),以减少主服务器上的负载。

1 个答案:

答案 0 :(得分:3)

除非你使用无锁提示,否则你无法获得脏读..

在AlwaysOn中启用只读辅助节点时..内部SQL使用rowversioning存储该行的先前版本..

此外,您正在使用同步提交模式,这可确保首先在辅助级别上提交日志记录,然后在主要级别上提交。

您所看到的是数据延迟..

这个whitePaper处理这种情况。下面是相关部分,有助于更多地了解它..

  

在辅助副本上运行的报告工作负载将产生一些数据延迟,通常为几秒到几分钟,具体取决于主要工作负载和网络延迟。

     

即使您已将辅助副本配置为同步模式,也存在数据延迟。虽然同步副本确实通过在向主数据库发送ACK之前强化已提交事务的事务日志记录来帮助保证理想条件(即RPO = 0)中的数据丢失,但它并不保证REDO线程在辅助副本上确实已将关联的日志记录应用于数据库页面。

     

因此存在一些数据延迟。您可能想知道在异步模式下配置辅助副本时是否更有可能出现此数据延迟。这是一个更难回答的问题。如果主副本和辅助副本之间的网络无法跟上事务日志流量(即,如果没有足够的带宽),则异步副本可能会进一步落后,从而导致更高的数据延迟。

     

对于同步副本,网络带宽不足不会导致辅助设备上的数据延迟更高,但会降低主要工作负载的事务响应时间和吞吐量