我们有一个(MySQL)数据库集群。从性能的角度来看,我们的顾问建议我们对所有写入(而不是读取)具有因果关系。我将通过两个示例来说明我有关此类阅读的问题。
示例1
由几个高级步骤组成的批处理作业,按顺序执行。
大约50%的时间,步骤2会在群集中尚未更新的另一台服务器上结束。数据仍然显示为状态A,并被步骤2忽略。
示例2
批处理作业,按顺序(按名称)从磁盘读取文件,并根据其内容插入数据。
NewIndex != LastIndex + 1
,则抛出:存在间隙。这不应该发生。对于第一个文件以外的文件,这往往会出错。如果获取最新索引查询的服务器尚未收到最新插入信息,则表明存在间隙,并且我们对间隙检查的判断为假。
解决方案?
我们可以用Task.Delay
来掩盖我们的流程,但是除了难看之外,这肯定会引起一些问题。我们可以为围绕特定查询的因果读取设置会话变量,但这很容易被遗忘,这很可怕-更不用说对存储库可读性的影响了。
我们如何解决这些问题而又没有任何(重大)风险或代码复杂性?
因果读取对实际性能有何影响?说,如果花费的时间延长了20%,那就值得了。