9.2. 隔离级别
Data Grid 提供两种隔离级别 - READ_COMMITTED 和 REPEATABLE_READ。
这些隔离级别决定了读取器何时看到并发写入,并在内部使用 MVCCEntry 的不同子类实现,其在状态重新提交到数据容器的方式上具有不同的行为。
下面是一个更详细的示例,它应该帮助了解数据网格上下文中 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()