Sobes.tech
Middle

Kokie reikalavimai keliami sandoriams programinės įrangos kūrimo kontekste?

sobes.tech AI

Atsakymas iš AI

Transakcijos turi atitikti ACID savybes:

  • Atomingumas (Atomicity): Transakcija turi būti arba visiškai įvykdyta, arba visiškai atšaukta. Jei kuri nors transakcijos dalis nepavyksta, visa transakcija grąžinama į pradinę būseną.
  • Nuoseklumas (Consistency): Transakcija perkelia duomenų bazę iš vienos nuoseklios būsenos į kitą. Ji neturi pažeisti duomenų vientisumo ar apribojimų taisyklių.
  • Izoliacija (Isolation): Vienu metu vykdomos transakcijos neturi įtakoti viena kitos. Daugelio transakcijų vykdymo rezultatas turi būti toks pat, tarsi jos būtų vykdomos nuosekliai. Izoliacijos problemos apima:
    • Purvinas skaitymas (Dirty read): Duomenų skaitymas, kurie dar nėra patvirtinti (commit) kitos transakcijos.
    • Nepakartojamas skaitymas (Non-repeatable read): Kartotinai skaitant tuos pačius duomenis vienos transakcijos metu, gaunami skirtingi rezultatai, nes kita transakcija juos pakeitė ir patvirtino.
    • Fantominis skaitymas (Phantom read): Kartotinai vykdant užklausą su sąlyga, grąžinamas kitas įrašų rinkinys, nes kita transakcija pridėjo arba pašalino įrašus, atitinkančius sąlygą.
  • Patvarumas (Durability): Sėkmingai užbaigus transakciją (patvirtinus), jos atlikti pakeitimai turi būti nuolatiniai ir atlaikyti sistemos gedimus (pavyzdžiui, maitinimo nutraukimą).

Java dažnai naudojami transakcijų valdymui tokie karkasai kaip Spring Framework su deklaratyviu transakcijų valdymu (@Transactional) arba Java Transaction API (JTA).

@Transactional pavyzdys:

@Transactional  
public void processOrder(Order order) {  
    // Užsakymo apdorojimo logika  
    // Pavyzdžiui, išskaityti lėšas iš sąskaitos  
    accountService.debit(order.getCustomerId(), order.getAmount());  

    // Užsakymo būsenos atnaujinimas  
    orderRepository.updateStatus(order.getId(), "Processed");  

    // Jei įvyksta klaida (pavyzdžiui, trūksta lėšų)  
    // visa transakcija automatiškai atšaukiama,  
    // jei nėra nurodyta kitaip (@Transactional(noRollbackFor = ...))  
}