Pau*_*aul 5 sql sql-server acid alwayson
我有一对 SQL Server 2014 数据库,设置为同步 AlwaysOn 可用性组。
两台服务器均设置为Synchronous commit可用性模式,会话超时时间为 50 秒。次级设置为Read-intent only可读辅助设备。
如果我写入主数据库,然后立即从辅助数据库读取(通过ApplicationIntent=ReadOnly),我会始终读取脏数据(即写入之前的状态)。如果我在写入和读取之间等待大约一秒钟,我就会得到正确的数据。
这是预期的行为吗?如果是这样,我可以采取什么措施来确保从辅助设备读取的数据是最新的?
我想使用辅助数据库作为主数据库的只读版本(以及故障转移),以减少主数据库的负载。
除非使用无锁提示,否则不可能获得脏读。
当您在AlwaysOn中启用只读辅助时..内部SQL使用行版本控制来存储该行的先前版本..
此外,您使用同步提交模式,这确保日志记录首先在辅助数据库上提交,然后在主数据库上提交。
您看到的是数据延迟..
本白皮书涉及这种情况。以下是相关部分,有助于了解更多信息。
在辅助副本上运行的报告工作负载将产生一些数据延迟,通常为几秒到几分钟,具体取决于主要工作负载和网络延迟。
即使您已将辅助副本配置为同步模式,数据延迟仍然存在。虽然同步副本确实通过在向主数据库发送 ACK 之前强化已提交事务的事务日志记录来帮助保证在理想条件(即 RPO = 0)下不丢失数据,但它并不能保证 REDO 线程辅助副本上确实已将关联的日志记录应用到数据库页面。
所以存在一些数据延迟。您可能想知道,当您在异步模式下配置辅助副本时,是否更有可能出现这种数据延迟。这是一个更难回答的问题。如果主副本和辅助副本之间的网络无法跟上事务日志流量(即,如果没有足够的带宽),则异步副本可能会进一步落后,从而导致更高的数据延迟。
在同步副本的情况下,网络带宽不足不会导致辅助副本上的数据延迟较高,但会减慢主工作负载的事务响应时间和吞吐量