我遇到了数据库中的数据恢复到旧状态的问题。我想我已将问题缩小到这种情况。
想象一下两次购买的顺序如下:
我们现在丢失了数据,因为数据库记录被重写了部分过时的信息。
如何使用持久连接的PHP5和libmemcached来防止这种情况?我想我想要的是缓存节点根本不进行故障转移;它应该只是无法读取和写入该节点,但不能将其从池中删除,以便我不会以重复记录结束。
当节点出现故障时,这将使我的数据库的负载增加1 / n(其中n是缓存节点的总数),但它最终会导致数据不一致。
不幸的是,我无法理解应该更改哪些设置以获得此行为。
答案 0 :(得分:2)
我喜欢在Doctrine ORM中实现的versioning and optimistic lock approach。你也可以做到的。它不会增加数据库的负载,但需要进行一些重构。
基本上,您为要缓存的所有表添加版本号,将update
查询更改为增加版本version = version + 1
并添加where version=$version
条件(请注意$version
来来自你的php / memcache)。您需要检查受影响的行数,如果为0则抛出异常。
由您决定如何处理此类异常。您可以为此记录无效缓存,并要求用户重新提交表单,或者您可以尝试合并更改。此时,您具有来自缓存的过时数据,来自用户输入的更新以及来自数据库的新数据,因此唯一不可恢复的情况是当您对同一列有3个不同的值时。
答案 1 :(得分:1)
你使问题变得更加复杂,一个简单的方法应该只是将缓存标记为脏并重建它,而不仅仅是将其重新投入使用,并且数据不一致。