我有一个关于 counterCache 的问题,文档根本没有说明。counterCache 在更新字段值时是否检查竞争条件?
例如,假设我们有一个论坛实现,并且对于每个论坛,我们通过 counterCache 存储了n个主题。然后,如果两个用户几乎同时使用该模型(足以重叠他们的操作,这意味着当一个人结束它时,另一个人仍然会使用它),一个人创建一个新主题,另一个人(假设它可以) 删除另一个主题,那么它会准确显示n 个主题,而不是n+1或n-1吗?
我有一个关于 counterCache 的问题,文档根本没有说明。counterCache 在更新字段值时是否检查竞争条件?
例如,假设我们有一个论坛实现,并且对于每个论坛,我们通过 counterCache 存储了n个主题。然后,如果两个用户几乎同时使用该模型(足以重叠他们的操作,这意味着当一个人结束它时,另一个人仍然会使用它),一个人创建一个新主题,另一个人(假设它可以) 删除另一个主题,那么它会准确显示n 个主题,而不是n+1或n-1吗?
我相信它可以,但不是因为 Cake,而是因为非事务行为中的多个 SQL 操作,并且同时来自多个客户端(用户)。任何有或没有框架的 Web 应用程序都会遇到这种情况。
我对 SQL 事务不是很精通,但我很确定某种事务配置会阻止这种形式的发生。
正如 burzum 所说,论坛示例绝对不用担心。
无论什么操作先完成,都会是结果。操作同时发生是非常不可能的,并且在技术上可能是不可能的。所以两者中的一个是第一位的。然后还有服务器和浏览器接收请求所需的时间。因此,每当下一个视图请求到来时,您都会在数据库中获得此时已更新的任何内容。
通过检查代码,您还可以看到代码正在执行 find('count') 而不是递增/递减 +/- 1。http://api.cakephp.org/2.3/source-class-Model.html#1913-1981所以在前一个动作完成后缓存被写入。
最后,我真的不会担心计数是否会暂时减少 +/- 1,特别是在论坛中。