我试图通过一个例子来理解同时期和非阻塞的参数。请让我知道我是否正确。
假设我们有事务 T1、T2、T3 发生在时间戳 =
10。T1、T2、T3 分别在 30、40、50 提交。如果查询事务在 35 出现:
for contemporaneous:查询读取已提交 T1 的版本,并让 T2 和 T3 等待读取完成。
对于非阻塞:只有在所有 3 个事务 T1、T2、T3 在 50 处提交后,查询才能读取。
我试图通过一个例子来理解同时期和非阻塞的参数。请让我知道我是否正确。
假设我们有事务 T1、T2、T3 发生在时间戳 =
10。T1、T2、T3 分别在 30、40、50 提交。如果查询事务在 35 出现:
for contemporaneous:查询读取已提交 T1 的版本,并让 T2 和 T3 等待读取完成。
对于非阻塞:只有在所有 3 个事务 T1、T2、T3 在 50 处提交后,查询才能读取。
如果您考虑在灾难恢复副本集群上进行查询,这是最容易理解和最重要的。在 DR 设置中,主服务器上的每个林都将其日志帧复制到副本上的匹配林。数据库中通常有多个林,并且由于复制是在林级别进行的,因此某些林的数据可能比其他林稍晚一些。
现在想象一个(只读)查询进入副本上的数据库。你有两个选择。一,您可以在拥有所有数据的最后一个时间戳(即非阻塞)处运行查询。第二,您可以在您看到任何数据的最后一个时间戳(在最远的森林中)运行查询并等待所有数据到达(对于其他森林),以便您可以在以后获得事务一致的视图(这是同时代的)。
请注意,这两个选项在事务上是一致的。这只是关于数据库如何选择您希望查询运行的时间戳。
只读查询总是无锁运行。