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