![]() |
1
2
这是你想做的。类似于mvcc,多版本货币控制。 简单地说,您需要将事务id与缓存元素相关联。 所以缓存条目看起来像这样:
缓存条目以相反的transactionid顺序存储在列表中。 当你去获取一个缓存元素时,你会查找列表(在你的散列映射中)。然后搜索具有最高事务ID的值,该值小于或等于事务的事务ID。 所以,让我们考虑一下删除问题。 你有第10笔交易,寻找“ABC”。我们假设ABC已经在缓存中了,它是由事务5放入的。 因此,t10获取abc的条目列表,向下搜索列表,发现在t5处有值“123”。t5是小于或等于t10的最高交易。t10将abc的值从123更改为456。 现在t12出现了,它寻找abc。它将从t10中找到456的值。t12决定删除abc,因此t12的一个“deleted”缓存条目被放置在缓存条目列表中。如果t10再次尝试查找abc,它将找到456,因为12>10,并且最高事务<=10是t10,因此它看不到删除。 t14出现,搜索abc,找不到它(因为它被“删除”),并插入一个新值789。如果t12看起来仍然会被删除,如果t10是,它仍然是456。 最后,缓存列表如下所示:
下一个问题是处理开放事务的可见性。也就是说,另一个事务是否可以看到另一个未提交的未完成事务的数据。但这并不太难,因为它只是在扫描合适候选人的版本列表时调整标准。您还可以保留一个事务id列表,其中包含它们的状态(open、committed、rolledback)。 最后,你必须想出一个机制来清理松散的末端。提交两个事务后,如果没有其他打开的事务,则可以删除较旧的记录。 例如,如果您有来自t5和t10的数据,如果这两个数据都已提交,那么将无法再次“看到”t5的数据,因为t10现在是“当前”状态。因此,可以删除t5行。 这可能最好通过简单地遍历缓存并删除过时的事务条目来完成。 这就是它的要点,显然魔鬼在细节。 |
![]() |
tincho87 · 避免Javascript/Css缓存 6 年前 |
![]() |
Zac · 如何强制客户端重新下载我的网站? 6 年前 |
![]() |
Kumar · bitbake清理使用只读NFS SSTATE缓存失败 6 年前 |
![]() |
Chris Williams · 休眠/JPA缓存查找值 6 年前 |
![]() |
Nymeria · 仅绑定到当前事务的Spring缓存 6 年前 |