Aktywne Wpisy
xena_x +1
Co w XXI wieku może zaoferować przeciętny mężczyzna kobiecie?
Pomijam dobra materialne i finansowe, s*ks, dziecko.
Czy przeciętny polski mężczyzna ma cokolwiek kobiecie do zaoferowania?
- poczucie bezpieczeństwa
- wsparcie
Pomijam dobra materialne i finansowe, s*ks, dziecko.
Czy przeciętny polski mężczyzna ma cokolwiek kobiecie do zaoferowania?
- poczucie bezpieczeństwa
- wsparcie
![xena_x - Co w XXI wieku może zaoferować przeciętny mężczyzna kobiecie?
Pomijam dobra ...](https://wykop.pl/cdn/c3201142/8763b4706aca2ac6e4720178683cb0d91117bd90666c7238839fb477a8cca057,w150.jpg)
źródło: Screenshot_20240703_094116_TikTok
Pobierz![Onaaa20](https://wykop.pl/cdn/c3397992/Onaaa20_6hI6YKwIs1,q60.jpg)
Onaaa20 +37
Its over…
#rozowepaski #niebieskiepaski #pieklokobiet #hipergamia #blackpill #p0lka #tinder #zwiazki #przegryw
#rozowepaski #niebieskiepaski #pieklokobiet #hipergamia #blackpill #p0lka #tinder #zwiazki #przegryw
![Onaaa20 - Its over…
#rozowepaski #niebieskiepaski #pieklokobiet #hipergamia #blackpil...](https://wykop.pl/cdn/c3201142/75914cdae4ccc8d099cc0f6a641960e986ab84eca4db350c033ffa3cad600eb5,w150.jpg?author=Onaaa20&auth=3a794849e65d6e0f81eec389eead6d10)
źródło: IMG_4981
Pobierz
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
@Transactional
public 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?
Komentarz usunięty przez autora Wpisu
@Patres: chacik chyba tego nie ogarnął xD
W takim zadaniu sam kod to najmniejszy problem. Pesimistic lock powoduje ze inne watki beda czekac co sie nie skaluje dobrze.
@newbie_235235: Dokładnie tak jest, ale nie przybliża mnie to do docelowego rozwiązania - skoro "Pesimistic lock powoduje że inne watki beda czekac co sie nie skaluje dobrze" <w pełni się z tym zgadzam> oznacza też to, że response poniżej 100ms może być mniej osiągalny przy większej ilości. Dlatego zastanawiam
I tylko sprawdzić czy się udało z odpowiedzi bazy.
Całą robotę zapewnienia spójności zrzucamy na bazę. A jak to za wolno działa to rozrzucić kupony przez sharding na wiele baz danych.
@Patres: Co do zadania to przypadek wręcz książkowy dla Cassandra / Datastax Astra. Rozproszona architektura, shared nothing, dostępność 99,9999 a 2000 TPS to pikuś (ta baza robi 350 tys zapytań na sekundę na... laptopie). Tickety oczywiście aktualizujesz jednym transakcyjnym UPDATE I baza ogarnie za Ciebie spójność automatycznie. Ty po stronie aplikacji tylko musisz sprawdzić wynik zapytania czy update się udał.
https://stackoverflow.com/a/30156346
@Krolik: Czyli dodawałbyś adnotację @Transactional? Jeżeli tak, to jaki poziom izolacji, ja bym dał dla pewności - isolation repeatable read.