IOS ゲームを開発しており、バックエンドに google-app-engine を使用しています。ユーザーは、建物をタップしてゲーム内のお金を現金化できます。ユーザーはいくつかの建物をかなり速くタップし、これにより、同じオブジェクト (USER) と異なる建物で複数の同時トランザクションが発生します。
残念ながら、これは再試行が失われるため、4 ~ 5 回目のタップがタイムアウトになることを意味します。また、2回目から5回目のタップはロックにより非常に遅いということです。
私の最初の考えは、トランザクションをタスクにすることでしたが、最初の呼び出しがまだ完了していないため、関数の 2 回目の呼び出しで 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();
}
}
}