Ishga tayyor · Transaction va idempotency
Daraja: Ilg'or
Pul, buyurtma va retry oqimlarida dubl yozuv hamda yarim holatni oldini olish.
Tushuntirish
## Ishdagi vazifa Bir use-case ichidagi bog‘liq DB o‘zgarishlari birga commit yoki rollback bo‘lishi kerak. Transaction odatda service chegarasida turadi. Tashqi HTTP chaqiruvini uzoq DB transaction ichida ushlab turish lock va timeout xavfini oshiradi.
## Idempotency Tarmoq uzilganda client bir xil POSTni qayta yuborishi mumkin. Idempotency key user/operation doirasida unique saqlanadi; bir xil key va payload oldingi natijani qaytaradi, boshqa payload conflict beradi. Unique constraint poygani DB darajasida to‘xtatadi. Optimistic locking bir-birining o‘zgarishini jim bosib ketmaslikka yordam beradi.
## Ishga tayyor mezon Nomzod concurrent ikki request va crash nuqtalarini test qiladi.
Kod misoli
@Transactional
public Receipt pay(long orderId, String key) {
return attempts.find(key).map(Attempt::receipt)
.orElseGet(() -> executeOnce(orderId, key));
}
// DB: UNIQUE(user_id, idempotency_key)
Keng tarqalgan xatolar
- Faqat avval `find` qilib, unique constraint qo‘ymaslik — parallel requestlar ikkalasi ham o‘tadi.
Mashqlar
- Bir xil key bilan parallel 20 request yuboradigan integration test yozing.
- Transaction ichidagi tashqi API chaqiruvini outbox oqimiga ajrating.
Teglar: career-02, transaction, reliability, ishga-tayyor