Tag: 竞争条件

如何持续增加计数器缓存列?

假设我有一个计数器缓存,需要在每次页面加载时递增。 假设我有10个Web实例。 如何持续增加计数器缓存列? 一个Web实例可以轻松实现一致性。 但是在多个实例运行时,可能会出现竞争条件。 这是一个快速解释。 假设我的计数器缓存列称为foo_counts ,其起始值为0.如果同时加载2个Web实例,则两者都将计数视为0.当需要增加计数时。 它们都将计数从0增加到1。 我查看了http://guides.rubyonrails.org/active_record_querying.html#locking-records-for-update 任何想法将不胜感激。

模拟RSpecunit testing中的竞争条件

我们有一个异步任务,可以为对象执行可能长时间运行的计算。 然后将结果缓存在对象上。 为了防止多个任务重复相同的工作,我们使用primefacesSQL更新添加了锁定: UPDATE objects SET locked = 1 WHERE id = 1234 AND locked = 0 锁定仅适用于异步任务。 对象本身仍可由用户更新。 如果发生这种情况,旧版本对象的任何未完成任务都应丢弃其结果,因为它们可能已过时。 使用primefacesSQL更新也很容易: UPDATE objects SET results = ‘…’ WHERE id = 1234 AND version = 1 如果对象已更新,其版本将不匹配,因此结果将被丢弃。 这两个primefaces更新应该处理任何可能的竞争条件。 问题是如何在unit testing中validation。 第一个信号量很容易测试,因为它只是用两种可能的场景设置两个不同的测试:(1)对象被锁定的位置和(2)对象未被锁定的位置。 (我们不需要测试SQL查询的primefaces性,因为这应该是数据库供应商的责任。) 如何测试第二个信号量? 在第一个信号量之后但在第二个信号量之前的某个时间,对象需要由第三方更改。 这将需要暂停执行,以便可以可靠且一致地执行更新,但我知道不支持使用RSpec注入断点。 有没有办法做到这一点? 还是有一些其他技术我忽略了模拟这样的竞争条件?