我们正在开发一款IOS游戏,并使用google-app-engine作为后台。用户可以通过点击建筑物来兑现游戏中的钱。用户点击多个建筑物的速度相当快,这会导致同一对象(用户)和不同建筑物上的多个并发事务。
不幸的是,这意味着4-5次点击超时,因为它失去了重试。这也意味着,由于锁住,第二次到第五次敲击非常慢。
我的第一个想法是把事务变成一个任务,但是在第二次调用函数时totalAmount就会出错,因为第一次调用还没有完成。
那么,有什么好方法可以支持对同一实体的多个快速更新呢?
int retries = 5;
while (retries > 0) {
// Wrap everything into a transaction from here
TransactionOptions options = TransactionOptions.Builder.withXG(true);
Transaction txn = datastore.beginTransaction(options);
try{
// Ok we got the template - now check against the
// Update user... with money gained
// Update Building...money withdrawn
//Do the transaction
datastore.put(txn, user.getEntity());
datastore.put(txn, building.getEntity());
txn.commit();
// do callback code...which returns TotalMoney
break;
} catch (Exception e) {
if(retries > 0){
retries--;
}
else{
//fail code...
} finally {
if (txn.isActive()) {
txn.rollback();
}
}
}发布于 2012-04-25 00:54:54
为了一致性,你需要事务,为了响应,你应该使用后端:
对于fast update.
发布于 2012-04-25 04:12:36
一种可能是不使用XG事务,或者根本不使用事务。相反,有一个事务日志会更有好处,您可以在其中记录所有操作。这样,您可以让任务或后端应用事务日志的影响,这样,如果出现故障,它们最终将变得一致。这将极大地提高您的前端吞吐量,而且从长远来看,它将使客户服务变得更容易。
要记住的一件事是关于实体组更新的一般经验法则:设计实体组,使其以1/s的速率更新。实际速率要高得多,但这是防止冲突和争用的好规则。
https://stackoverflow.com/questions/10302205
复制相似问题