8.2. 隔离级别
Data Grid 提供两种隔离级别 - READ_COMMITTED 和 REPEATABLE_READ。
这些隔离级别决定了读者何时看到并发写入,并使用不同的 MVCCEntry 类进行内部实施,它们在如何提交回数据容器时的行为不同。
以下是一个更详细的示例,它可以帮助了解 Data Grid 上下文中 READ_COMMITTED 和 REPEATABLE_READ 之间的区别。使用 READ_COMMITTED 时,如果在同一键的两个连续读取调用之间,键已被另一个事务更新,第二个读取可能会返回新的更新的值:
Thread1: tx1.begin()
Thread1: cache.get(k) // returns v
Thread2: tx2.begin()
Thread2: cache.get(k) // returns v
Thread2: cache.put(k, v2)
Thread2: tx2.commit()
Thread1: cache.get(k) // returns v2!
Thread1: tx1.commit()
使用 REPEATABLE_READ 时,最终的 get 仍会返回 v。因此,如果您在事务内多次检索同一密钥,您应该使用 REPEATABLE_READ。
但是,因为 REPEATABLE_READ 也不会获取 read-locks,所以可能会出现这个缺陷:
cache.get("A") // returns 1
cache.get("B") // returns 1
Thread1: tx1.begin()
Thread1: cache.put("A", 2)
Thread1: cache.put("B", 2)
Thread2: tx2.begin()
Thread2: cache.get("A") // returns 1
Thread1: tx1.commit()
Thread2: cache.get("B") // returns 2
Thread2: tx2.commit()