2013-02-15 14 views
5

że mam następującą strukturę:Firebase: jak wprowadzić transakcję?

{ 
    "-InSwU2yHOEHwhP_m4_n" : { 
    ".priority" : 0.0, 
    "name" : "abc" 
    }, 
    "-InSw_P0j8A-0Njj0Uvf" : { 
    ".priority" : 1.0, 
    "name" : "def" 
    } 
} 

chciałbym dodać inny podobny przedmiot z GUID jako kluczowy priorytet i jest równa liczbie elementów prezentowanych obecnie (w tym przypadku 2). Wynik powinien wyglądać mniej więcej tak:

{ 
    "-InSwU2yHOEHwhP_m4_n" : { 
    ".priority" : 0.0, 
    "name" : "abc" 
    }, 
    "-InSw_P0j8A-0Njj0Uvf" : { 
    ".priority" : 1.0, 
    "name" : "def" 
    }, 
    "-InSxV-RVkZ07_f3uDnJ" : { 
    ".priority" : 2.0, 
    "name" : "ghi" 
    } 
} 

Zauważ, że wielu klientów może próbować dodać taką pozycję w tym samym czasie, musi to być transakcji.

Wszelkie pomysły?

Odpowiedz

3

Podczas korzystania z push() każdej pozycji przypisany jest unikatowy identyfikator. Tak więc transakcja nie byłaby konieczna (nie może być kolizji).

Jeśli chcesz, aby rekordy były unikalne według priorytetu (co wygląda na to, co chcesz osiągnąć), myślę, że powinieneś po prostu używać priorytetu jako identyfikatora.

Następnie można użyć transakcji aby upewnić się, że dwóch klientów nie naciskać jednocześnie:

FB.child(path).transaction(function(current_val) { 
    if(current_val === null) { 
     /* set the value here */ 
    } 
    /* do nothing; transaction fails because it was already written */ 
}, function(success) { 
    /* transaction done */ 
}); 

Jednakże, jeśli używasz priorytet jako unikalny ID, może to należy przemyśleć ; to jest naprawdę praca dla identyfikatorów i robi świetną robotę; zapisy są również zachowywane w kolejności, w jakiej są wstawiane, więc w większości przypadków licznik jest niepotrzebny.

+0

Dzięki Kato! Powinienem również zauważyć, że jeśli użyjesz funkcji push(), elementy pojawią się w kolejności, w jakiej zostały dodane (o ile zostały wypchnięte z tego samego klienta, inni klienci mogą mieć skośne zegary, które staramy się zrekompensować , ale nie zawsze w 100% z powodzeniem). –

Powiązane problemy