分享

RC、RR级别快照读的不同之处

 轻语者 2023-10-26 发布于广东

在数据库事务的隔离级别中,RC(Read Committed)和RR(Repeatable Read)级别是常见的两种级别。在这两种级别下,快照读的结果会有所不同,主要是由于生成 Read View 的时机不同所导致的。

在RR级别下,当某个事务第一次进行快照读时,会创建一个快照 Read View。之后,该事务进行快照读操作时,仍然使用同一个 Read View。这意味着,只要当前事务在其他事务提交更新之前使用过快照读,之后的快照读都会使用同一个 Read View。因此,对于之后的更新操作,当前事务是不可见的。这种机制确保了在RR级别下事务的读操作是相对独立的,可以避免脏读(Dirty Read)和不可重复读(Non-repeatable Read)的问题。

相比之下,在RC级别下,事务中的每次快照读都会生成一个新的快照和 Read View。这就是为什么在RC级别下的事务中可以看到其他事务提交的更新。每次快照读都会生成一个新的 Read View,该 Read View 反映了事务开始时刻的数据库状态。因此,如果其他事务在当前事务进行快照读之后提交了更新,当前事务仍然可以看到这些更新,因为它使用的是新生成的 Read View。这种机制提供了更高的并发性,允许事务之间读取彼此的更新,但也可能导致不可重复读的问题。

不可重复读是指在同一个事务中,多次读取同一数据行时,得到的结果不一致。在RC级别下,由于每次快照读都会生成一个新的 Read View,事务之间的读操作可以看到其他事务提交的更新,从而可能导致不可重复读的问题。例如,一个事务在读取某个数据行后,另一个事务修改了该数据行并提交了更新,而第一个事务再次读取该数据行时,得到的结果就会发生变化。

当需要保证数据的一致性和稳定性时,选择RR级别可以更好地满足需求。因为在RR级别下,事务之间的读操作是相对独立的,每次快照读使用的是同一个 Read View,对于之后的更新操作是不可见的。这样可以避免不可重复读的问题,保证事务读取的数据是一致的。

然而,在某些应用场景下,需要更高的并发性和实时性,可以选择RC级别。在RC级别下,事务之间的读操作可以看到其他事务提交的更新,这提供了更大的并发性,允许事务之间读取彼此的更新。但同时也需要注意处理不可重复读的问题,可能需要通过其他机制来保证数据的一致性。

综上所述,RC/RR级别下的快照读有着不同的行为。在RR级别下,快照读使用的是同一个 Read View,对于之后的更新操作是不可见的,可以保证数据的一致性和稳定性。而在RC级别下,每次快照读都会生成一个新的 Read View,可以看到其他事务提交的更新,提供了更高的并发性,但可能导致不可重复读的问题。在选择隔离级别时,需要根据具体的应用场景和需求来权衡不同级别的优劣,以满足数据一致性和并发性的要求。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多