我们正在开发一款 IOS 游戏,并使用 google-app-engine 作为后端。用户可以通过点击建筑物来兑现游戏中的钱。用户以相当快的速度点击多个建筑物,这会导致同一对象(USER)和不同建筑物上的多个并发事务。
不幸的是,这意味着第 4-5 次点击超时,因为它失去了重试。这也意味着由于锁定,第 2 次到第 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();
}
}
}