Kursda artıq transaksiyanın nə olduğunu qeyd etmişdik. Xatırladaq, bu — bir-birini izləyən əməliyyatlar ardıcıllığıdır və onlar bir bütöv kimi icra olunmalıdır. Məsələn, bank köçürməsi etmək lazımdırsa. Bu halda bir hesabdan pul çıxarılır və digər hesaba əlavə olunur. Əgər bu hərəkətlərdən biri alınmasa (məsələn, pul çıxarıldı, amma əlavə olunmadı), bir yığın problem yaranacaq. Məhz burada transaksiyalar köməyə gəlir.
Transaksiya ya tamamilə icra olunur, ya da ümumiyyətlə icra olunmur. Buna "hamısı və ya heç nə" prinsipi deyilir.
BEGIN;
-- Bir hesabda balansı azaldırıq
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- Digər hesabda balansı artırırıq
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT; -- Dəyişiklikləri tətbiq edirik
Əgər nəsə düz getməsə, ROLLBACK ilə dəyişiklikləri geri qaytarmaq olar.
ACID transaksiyaların xüsusiyyətləri nədir
PostgreSQL-də (və ümumiyyətlə relasional verilənlər bazalarında) transaksiyalardan danışanda tez-tez ACID qısaltması çəkilir — bu kimya deyil. ACID açılışı belədir: Atomicity (atomluq), Consistency (uyğunluq), Isolation (izolyasiya), Durability (dayanıqlılıq). Bu dörd xüsusiyyət məlumatların təhlükəsiz, ardıcıl və sürprizsiz işlənməsini təmin edir.
Atomluq (Atomicity)
Transaksiya ya tam icra olunur, ya da ümumiyyətlə olmur. Əgər içində nəsə səhv getsə — hər şey geri qaytarılır. Təsəvvür elə: pul köçürürsən, birdən səhv oldu — ya hər şey ləğv olunur, ya da köçürmə tam baş tutur. Heç bir "yarımçıq" əməliyyat yoxdur.
Uyğunluq (Consistency)
Transaksiya bitəndən sonra baza düzgün, məntiqli vəziyyətdə qalır. Bütün qaydalar, məhdudiyyətlər və cədvəllər arası əlaqələr qorunmalıdır. Məsələn, əgər mənfi balans qadağandırsa, bu qaydanı pozan transaksiyanı baza qəbul etməyəcək.
İzolyasiya (Isolation)
Bir transaksiyanın sonu çatmamış, digər transaksiyalar onun aralıq məlumatlarını görməməlidir. Bu, qəribə effektlərdən qoruyur — məsələn, "müəyyən olunmamış" vəziyyətləri görməkdən. Təsəvvür elə, onlayn mağazada pul çıxılıb, amma məhsul sifarişə əlavə olunmayıb — xoş deyil, düzdür?
Dayanıqlılıq (Durability)
Əgər transaksiyanın icrası uğurla bitibsə, bütün dəyişikliklər mütləq bazada qalacaq. Hətta dərhal sonra işıq getsə belə — məlumatlar yerindədir. Bu, "Yadda saxla" düyməsini basıb, hər şeyin həqiqətən qorunduğuna əmin olmaq kimidir.
Bu dörd xüsusiyyət — transaksiyaların verilənlər bazasında etibarlı mexanizm olmasının əsas səbəbidir.
Transaksiyaların istifadə olunduğu ssenarilər
Teoriya yaxşıdır, amma transaksiyaların əsl gücü real tapşırıqlarda ortaya çıxır. Məhz belə hallarda — pulla, əlaqəli cədvəllərlə və ya kütləvi dəyişikliklərlə — transaksiyalar əvəzolunmaz olur. Onlar əməliyyatları sadəcə icra etməyə yox, həm də əminliklə, məlumat itkisi və ya bazanı "yarımçıq" vəziyyətdə qoymaq riski olmadan etməyə kömək edir.
Budur, transaksiyaların həqiqətən vəziyyəti xilas etdiyi bir neçə tipik nümunə:
1. Ödənişlərin işlənməsi
Müştəri bir hesabdan digərinə pul köçürəndə, transaksiyalar pulu "yoxa çıxmaqdan" qoruyur:
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
Əgər birinci hesabda kifayət qədər vəsait yoxdursa, dəyişiklikləri geri qaytarmaq olar:
BEGIN;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
-- Ay, balans mənfidir!
ROLLBACK;
2. Əlaqəli cədvəllərin yenilənməsi
Təsəvvür elə, tələbənin statusunu "məktəbi bitirib" edirsən və eyni anda "məktəb məzunları" cədvəlinə qeyd əlavə edirsən:
BEGIN;
UPDATE students SET status = 'mezun oldu' WHERE student_id = 42;
INSERT INTO graduates (student_id, graduation_date) VALUES (42, '2023-06-10');
COMMIT;
Əgər əməliyyatlardan biri alınmasa (məsələn, INSERT zamanı səhv olsa), verilənlər bazası əvvəlki vəziyyətinə qayıdacaq.
3. Kütləvi məlumat yeniləmələri
Transaksiyalar böyük yeniləmələr üçün də faydalıdır, məsələn:
BEGIN;
UPDATE orders SET status = 'tamamlandı' WHERE delivery_date < CURRENT_DATE;
COMMIT;
Əgər server çökərsə və ya yeniləmənin səhv getdiyini görsən, istənilən vaxt dəyişiklikləri geri qaytara bilərsən!
Transaksiyalarla işləmək üçün komandalar
PostgreSQL bir neçə əsas komanda təqdim edir:
BEGIN: yeni transaksiyanı başladır:BEGIN;COMMIT: transaksiya çərçivəsində edilmiş bütün dəyişiklikləri təsdiqləyir (yadda saxlayır):COMMIT;
ROLLBACK: cari transaksiyada edilmiş bütün dəyişiklikləri geri qaytarır:
ROLLBACK;
Tam dövrə nümunəsi
BEGIN;
-- Bəzi əməliyyatlar
UPDATE accounts SET balance = balance - 200 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 200 WHERE account_id = 2;
-- Dəyişiklikləri geri qaytarırıq
ROLLBACK;
-- Yenidən başlayırıq
BEGIN;
-- Eyni əməliyyatlar, amma başqa köçürmə
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- Transaksiyanı bitiririk
COMMIT;
Transaksiyaların dərsdən kənar həyatı
Onlayn mağazalar. Bir çox platforma sifariş və ödənişləri idarə etmək üçün transaksiyalardan istifadə edir. Məsələn, sifariş yalnız uğurlu ödəniş olduqda tamamlanır. Əgər nəsə düz getməsə, sifariş avtomatik ləğv olunur.
Bank sistemləri. Transaksiyalar pulunu gözlənilməz işıq sönmələrindən qoruyur.
Transaksiya tarixi. PostgreSQL məlumatların bərpası üçün WAL (Write-Ahead Logging) jurnallarını saxlayır. Bu, transaksiyaları etibarlı edən magiyadır.
Növbəti leksiyada BEGIN, COMMIT və ROLLBACK komandalarını daha detallı öyrənəcəyik, həmçinin kütləvi əməliyyatlar və SAVEPOINT ilə qismən geri qaytarmanın nümunələrinə baxacağıq. Görüşənədək!
GO TO FULL VERSION