Middle
193
Proqram təminatı inkişafı kontekstində əməliyyatlara hansı tələblər qoyulur?
AI-dan cavab
sobes.tech Süni İntellekt
Əməliyyatlar ACID xüsusiyyətlərinə cavab verməlidir:
- Atomiklik: Əməliyyat ya tamamilə yerinə yetirilməli və ya tamamilə ləğv edilməlidir. Əgər əməliyyatın bir hissəsi uğursuz olarsa, bütün əməliyyat başlanğıc vəziyyətinə qaytarılır.
- Uyğunluq: Əməliyyat verilənlər bazasını bir uyğun vəziyyətdən digərinə keçirir. O, məlumatların bütövlüyünü və ya məhdudiyyət qaydalarını pozmamalıdır.
- İzolyasiya: Eyni vaxtda yerinə yetirilən əməliyyatlar bir-birinə təsir etməməlidir. Bir neçə əməliyyatın nəticəsi, sanki ardıcıl olaraq yerinə yetirilmiş kimi olmalıdır. İzolyasiya problemlərinə daxildir:
- Çirkli oxuma: Hələ başqa bir əməliyyat tərəfindən təsdiqlənməmiş (commit edilməmiş) məlumatların oxunması.
- Təkrarlanmayan oxuma: Eyni məlumatların bir əməliyyat daxilində bir neçə dəfə oxunması və fərqli dəyərlər alınması, çünki başqa bir əməliyyat onları dəyişib və təsdiqləyib.
- Fantom oxuma: Eyni əməliyyat daxilində sorğunun yenidən icrası zamanı, başqa bir əməliyyat tərəfindən əlavə olunmuş və ya silinmiş sətirlər ilə başqa bir sıra toplusu qaytarılır, çünki onlar şərtə cavab verir.
- Davamlılıq: Uğurla tamamlanan (təsdiqlənmiş) əməliyyatdan sonra, onun etdiyi dəyişikliklər daimi olmalı və sistem nasazlıqlarına (məsələn, enerji kəsilməsi) davam gətirməlidir.
Java-da, əməliyyatların idarə olunması üçün tez-tez Spring Framework kimi çərçivələr və deklarativ əməliyyat idarəetməsi (@Transactional) və ya Java Transaction API (JTA) istifadə olunur.
@Transactional istifadə nümunəsi:
@Transactional
public void processOrder(Order order) {
// Sifarişin işlənməsi loqikası
// Məsələn, hesabdan vəsaitin çıxarılması
accountService.debit(order.getCustomerId(), order.getAmount());
// Sifariş statusunun yenilənməsi
orderRepository.updateStatus(order.getId(), "Processed");
// Xəta baş verdikdə (məsələn, kifayət qədər vəsait yoxdursa)
// bütün əməliyyat avtomatik olaraq geri alınacaq,
// başqa cür göstərilməyibsə (@Transactional(noRollbackFor = ...))
}