Mam następujący problem: Mam usługę Java, która sumuje lub odejmuje wartość przechowywaną w mojej bazie danych Mongodb.
Na przykład, jeśli mam wartość 100 w bazie danych, a moja usługa jest wywoływana z wartością 10, wówczas występują następujące zdarzenia:
- Otrzymuję wartość 100 z bazy danych
- Sumuję 100 wartością 10
- Ponownie zapisuję nową wartość (110) w bazie danych
Obawiam się jednak współbieżności. Co się stanie, jeśli wiele osób wywoła tę samą usługę? Obawiam się niespójnej wartości na końcu procesu.
Pytanie brzmi: Ten proces opisany powyżej jest bezpieczny dla wątków? (Wierzę, że tak nie jest). Co powinienem zrobić, aby zachować spójność moich danych i radzić sobie z tą współbieżnością wątków?
AKTUALIZACJA
Poniżej następuje kod
public void update(Size entity, Integer newValue) {
Size size = repository.findOneById(entity.getId());
size.setTotal(size.getTotal() + newValue);
repository.update(size);
}
Odpowiedzi:
2 dla odpowiedzi № 1Nie, nie jest bezpieczny dla wątków ponieważ odtąd nie odbywa się to atomowo MongoDB
jest nie transakcyjna baza danych, powinieneś użyć $inc
operatora dla takiej potrzeby, ponieważ pozwala to na zwiększenie atomowo podane pola podanych kwot, więcej szczegółów tutaj.