擅长:python、mysql、java
<p>使用mapreduce是正确的方法。正如David建议的那样,计数器是一种选择,但它们并不可靠(它们使用memcache),而且它们也不是为大量并行的计数器而设计的。在</p>
<p>当前的mapreduce有两个问题:首先,<code>get_or_insert</code>每次调用它时都会执行一个数据存储事务。其次,更新事务外部的金额,并第二次异步存储它,从而产生您所关心的并发问题。在</p>
<p>至少在完全支持reduce之前,最好的选择是在事务中在映射器中执行整个更新,如下所示:</p>
<pre><code>def generate_expense_type(rec):
def _tx():
expense_type = type.get(name)
if not expense_type:
expense_type = type(key_name=name)
expense_type.total += rec.amount
expense_type.put()
db.run_in_transaction(expense_type)
</code></pre>