2017-08-18 9 views
0

Firebaseデータベース:GoogleのFirebaseリアルタイムデータベースのsetValue IF(条件)

{ 
    "balance" : 10 
} 

アプリケーション1(擬似コード):

if (balance-10 >= 0) 
{ 
    // Application freezes for a few seconds. (Connection/hardware issue or whatever reason) 
    balance -= 10; 
} 

アプリケーション2(擬似コード):

if (balance-10 >= 0) 
{ 
    // Application is executed without any problems. 
    balance -= 10; 
} 

両方のアプリケーションが同時に起動する場合、最後の "balance"値は "0"ではなく "-10"になります。この問題は容易であるMySQLでは

によって固定:

UPDATE `table` SETバランス= IF(バランス-10> = 0、バランス-10、バランス)。

Firebaseにはどのような解決策がありますか?

答えて

0

これはtransactionsによって処理されます。あなたは、私がウェブコードを示していますどのような技術で指定されていないので:

balanceRef.transaction(function(current) { 
    if (current && current > 10) { 
    return current - 10; 
    } 
    return (current || 0); 
} 

を複数のアプリケーションが同時にこのコードを実行する場合は、そのうちの一つは、そのトランザクションが拒否されますし、再試行します。

も参照してください:

+0

をそれは完璧に動作し、私もリターン 'null'なので最初の' doTransation'呼び出し、との問題を抱えていたし、あなたの2番目のURLは私を助けました。ありがとう。 (JavaBTW) – Thiago