Aktywne Wpisy


Seraficzna2 +6
Około połowa polaków ma styl przywiązania inny niż bezpieczny co oznacza, że bez psychoterapii prawdopodobnie nigdy nie będzie w stanie stworzyć trwałego i zdrowego związku. Miażdżąca nadwyżka takich osób znajduje się na aplikacjach randkowych, ponieważ wpadają i wypadają oni z rynku matrymonialnego i tak w kółko.
Osoby o stylu bezpiecznym mają filtr przez który (dość szybko) wchodzą w relacje z innymi osobami o stylu bezpiecznym przez co związki te są zdrowe i
Osoby o stylu bezpiecznym mają filtr przez który (dość szybko) wchodzą w relacje z innymi osobami o stylu bezpiecznym przez co związki te są zdrowe i





Mirki, czytam sobie różne pytania z system design i natrafiłem na coś takiego:
Jakbyście do tego podeszli? ChatGPT sugeruje
@Transactional@lock(LockModeType.PESSIMISTIC_WRITE)
@query("SELECT k FROM Kupon k WHERE k.kod = :kod")
Optional<Kupon> findByKodForUpdate(String kod);
i
@Transactionalpublic boolean wykorzystajKupon(String kod) {
return kuponRepository.findByKodForUpdate(kod).map(kupon -> {
if (kupon.getWykorzystania() < kupon.getLimitUzyc()) {
kupon.setWykorzystania(kupon.getWykorzystania() + 1);
kuponRepository.save(kupon);
return true;
} else {
return false;
}
}).orElse(false);
}
już pomijając polskie nazwy i save na już persisted encji
Czy ma to sens, czy jest to wystarczające?
Zakładając, że tak - to czy byłoby to wydajne i skalowane? W NoSQLowej bazie byłby pewnie łatwiej o wydajność, ale czy da się wtedy zrobić takiego locka?
1. Relacyjność raczej musi być - wątpię, aby w docelowym systemie nie chcielibyśmy powiązać kuponu z użytkownikiem i zamówieniem
2. Jednak aby zachować szybki response przechowywałbym użyte kupony w jakiejś NoSQL bazie - pewnie jakiś cache (Redis).
3. Gdy dostaniemy odpowiedź, że kupon jest/był dostępny to łączyłbym się już z transakcyjną bazą danych i w update tak jak sugerował @VlIN inkrementowałbym kupon
@Patres: No ale tutaj też z kolei miałbyś kolejny narzut na synchronizację bazy z cache. Cache nie zawsze jest spójny z tym co jest na bazie. I to też nie byłoby takie trywialne jak to ugryźć.
- weź kupon z licznika kuponów przez ten UPDATE
- jak się udało to dodaj do osobnej tabeli COUPON_USES event że kupon został wykorzystany w danym czasie i ew. jakiś stan wykorzystania kuponu, Reserved, used, cancelled
- Powiąż jakoś ten event z rekordem zamówienia
- commit transakcji
@VlIN: Operacja update nie zwraca nic,przynajmniej tak jest w JPA w Javie, ewentualnie Integer
@Patres: a co niby z tym ma wspólnego relacyjność? Bazy relacyjne nie nazywają się relacyjne dlatego że między tabelami są związki (klucz obcy, klucz główny). W bazach NoSQL też takie związki między użytkownikiem a zamówieniem zamodelujesz.
2. Zdajesz sobie sprawę z tego że cały system bankowy / płatniczy zbudowano bez ACID?