Transakcje działają w trybie SimpleDB firmy Amazon lub w zbitym klastrze baz danych. To znaczy, że są "ostatecznie zgodne", a nie gwarantowane spójne.
Tak więc podczas korzystania z transakcji funkcja przetwarzania może zostać wywołana więcej niż jeden raz z wartością lokalną (w niektórych przypadkach null, jeśli nigdy nie została pobrana), a następnie ponownie z wartością zsynchronizowaną (cokolwiek jest na serwerze).
Przykład:
pathRef.transaction(function(curValue) {
// this part is eventually consistent and may be called several times
}, function(error, committed, ss) {
// this part is guaranteed consistent and will match the final value set
});
To jest naprawdę myślenia, z którym trzeba podejść transakcję tak czy inaczej. Powinieneś zawsze oczekiwać wielu połączeń, ponieważ pierwsza transakcja może kolidować z inną zmianą i zostać odrzucona. Nie można użyć metody przetwarzania transakcji do pobrania wartości serwera (chociaż można ją odczytać z wywołania zwrotnego sukcesu).
Zapobieganie lokalnie wywołało zdarzenie
Gdy transakcja dojdzie, miejscowy zdarzenie jest wywoływane zanim dotrze do serwera za opóźnienia rekompensaty. Jeśli transakcja się nie powiedzie, zdarzenie lokalne zostanie cofnięte (wywoływane jest zdarzenie change lub remove).
Można użyć właściwości applyLocally
on transactions, aby zastąpić to zachowanie, co powoduje spowolnienie wyników lokalnych, ale zapewnia, że tylko wartość serwera jest uruchamiana lokalnie.
pathRef.transaction(function(curValue) {
// this is still called multiple times
}, function(error, committed, ss) {
// this part is guaranteed consistent and will match the final value set
},
// by providing a third argument of `true`, no local event
// is generated with the locally cached value.
true);
Dzięki, użyłem transakcji prawie 3 dni po wstawieniu danych. Mówisz więc, że najpierw musisz użyć transakcji, aby sprawdzić, czy dana wartość istnieje, czy nie? – Ashok
"W końcu trwały" nie ma nic wspólnego z długością, na jakiej znajdował się na serwerze, tylko z długością, na jakiej znajdował się na kliencie - nie ma go na kliencie, dopóki o to nie poprosisz. Nie musisz koniecznie sprawdzać, czy istnieje wartość, po prostu zaakceptuj, że funkcja może być wywołana wiele razy i "w końcu" zostanie wywołana z wartością serwera. – Kato
@Kato Podejrzewam, że ta transakcja byłaby zła dla serwera Node, aby obniżyć saldo użytkownika?Tak jak gdyby wcześniej inny serwer węzła zapisywał, to chcę, żeby zapisał tę samą rzecz (więc lepiej byłoby ustawić?) –