Gram trochę ze Springem i JPA/Hibernate i jestem nieco zdezorientowany na właściwej drodze do zwiększenia licznika w tabeli.Spring, JPA i Hibernate - jak zwiększyć licznik bez problemów z współbieżnością
Moja REST API musi zwiększać i zmniejszać jakąś wartość w bazie danych w zależności od działania użytkownika (na przykład mieszka, lubić lub nie lubić tag uczyni przyrost licznika lub zmniejszenia o jeden w tabeli Tag)
tagRepository jest JpaRepository (wiosna-data) i mam skonfigurowane transakcję jak ten
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"/>
@Controller
public class TestController {
@Autowired
TagService tagService
public void increaseTag() {
tagService.increaseTagcount();
}
public void decreaseTag() {
tagService.decreaseTagcount();
}
}
@Transactional
@Service
public class TagServiceImpl implements TagService {
pubic void decreaseTagcount() {
Tag tag = tagRepository.findOne(tagId);
decrement(tag)
}
pubic void increaseTagcount() {
Tag tag = tagRepository.findOne(tagId);
increment(tag)
}
private void increment(Tag tag) {
tag.setCount(tag.getCount() + 1);
Thread.sleep(20000);
tagRepository.save(tag);
}
private void decrement(Tag tag) {
tag.setCount(tag.getCount() - 1);
tagRepository.save(tag);
}
}
jak widać mam umieścić celowo spać o 20 sekundy na przyrost tuż przed .save(), aby być w stanie przetestować scenariusz współbieżności.
początkowy licznik znaczników = 10;
1) Użytkownik wzywa increaseTag a kod uderza sen więc wartość podmiotu = 11 i wartość w dB jest nadal 10
2) użytkownik wywołuje decreaseTag i przechodzi cały kod. wartość jest baza danych jest teraz = 9
3) Wykończenia zasypia i uderza .save z podmiotem mającym liczbę 11 i następnie uderza .save()
Kiedy sprawdzić baza danych, wartość tego znacznika jest teraz równa 11 .. kiedy w rzeczywistości (przynajmniej to, co chciałbym osiągnąć) byłaby równa 10
Czy to zachowanie jest normalne? Czy adnotacja @Transactional nie działa?
geniusz .. to jest 100 razy lepsze niż zamki pesymistów! – Johny19
(btw po zamieszczeniu mojego pytania szukałem jakiegoś dokumentu na temat poziomu izolacji i spadł na Właśnie zdałem sobie sprawę, że to twój blog) było bardzo jasne i dobrze wyjaśnione. więc +1 za to! – Johny19
Dziękuję za docenienie mojej pracy. –