CodeGym /Kurslar /SQL SELF /Transaksiyalarla işləmək üçün əsas komandalar: BEG...

Transaksiyalarla işləmək üçün əsas komandalar: BEGIN, COMMIT, ROLLBACK

SQL SELF
Səviyyə , Dərs
Mövcuddur

Database-də etdiyin bütün dəyişikliklər nəzarətdə və düzgün icra olunsun deyə, PostgreSQL transaksiya anlayışından istifadə edir. Bu, bir neçə SQL əməliyyatının birlikdə, bir blok kimi icra olunması deməkdir. Əgər nəsə səhv getsə, dəyişiklikləri geri qaytarmaq lazımdır. Bax, bu məqamda BEGIN, COMMITROLLBACK komandaları işə düşür.

Transaksiya komandaları sadəcə qayda üçün deyil — onlar datanı səhvlərdən və crash-lardan qorumaqda əsas rol oynayır. Bir neçə SQL əməliyyatı icra edəndə, əmin olmalısan ki, hər şey düz işləyəcək: əgər bir komanda keçməsə, baza əvvəlki vəziyyətinə qayıtmalıdır. Bu, transaksiyaların əsas səbəblərindən biridir — onlar datanın konsistentliyini qorumağa kömək edir.

Bundan əlavə, transaksiyalar atomiklik təmin edir: ya bütün dəyişikliklər birlikdə tətbiq olunur, ya da heç biri tətbiq olunmur. Bu yanaşma, məsələn, pul çıxılıb amma məhsul sifarişə əlavə olunmayıb kimi “yarımçıq” vəziyyətlərin qarşısını alır.

Və əlbəttə, transaksiyalar çeviklik verir. İstədiyin qədər mürəkkəb əməliyyat zəncirləri qura bilərsən, nə vaxt COMMIT edib dəyişiklikləri təsdiqləmək, nə vaxt ROLLBACK ilə ləğv etmək lazım olduğunu idarə edə bilərsən, hətta SAVEPOINT ilə nöqtəvi rollback-lər də edə bilərsən. Bütün bunlar database ilə işi həm təhlükəsiz, həm də idarəolunan edir.

BEGIN komandası

BEGIN komandası PostgreSQL-ə transaksiyanın başladığını bildirir. Bundan sonra etdiyin bütün dəyişikliklər “havada” qalır, ta ki, ya COMMIT ilə təsdiqləyirsən, ya da ROLLBACK ilə ləğv edirsən.

Tipik nümunə: tutalım, bir hesabdan digər hesaba 100 vahid pul köçürmək istəyirsən. Transaksiyanı BEGIN ilə başlayırsan:

BEGIN;
-- Transaksiyaya başladıq
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- 1-ci hesabda balansı azaltdıq
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- 2-ci hesabda balansı artırdıq
Vacibdir:

Transaksiya çərçivəsində komandaları icra etdiyin müddətdə, digər istifadəçilər sənin dəyişikliklərini görməyəcək. Onlar yalnız COMMIT icra edəndən sonra görünəcək.

COMMIT komandası

COMMIT komandası transaksiyanı bitirir və bu müddətdə etdiyin bütün dəyişiklikləri database-ə yazır. Bu komandadan sonra dəyişikliklər bütün istifadəçilər üçün görünür.

Transaksiyanın tamamlanmasına nümunə:

COMMIT;
-- Transaksiyadakı bütün dəyişikliklər yadda saxlanıldı

İndi yuxarıdakı nümunədə etdiyimiz balans dəyişiklikləri “daimi” oldu. Pul uğurla köçürüldü.

ROLLBACK komandası

Əgər transaksiyanı icra edərkən səhv tapsan və ya dəyişiklikləri ləğv etmək istəsən, ROLLBACK komandasından istifadə edə bilərsən. O, BEGIN-dən sonra edilən bütün əməliyyatları ləğv edir.

Tutalım, pul köçürəndə gördün ki, hesabda kifayət qədər vəsait yoxdur. Onda transaksiyanı geri qaytarırsan:

BEGIN;
-- Transaksiyaya başladıq
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;

-- Ay, səhv: kifayət qədər vəsait yoxdur.
ROLLBACK;
-- Bütün dəyişikliklər ləğv olundu, database əvvəlki vəziyyətinə qaytarıldı

ROLLBACK komandasından sonra database-də heç bir dəyişiklik saxlanılmır. Bu, səhvlərin qarşısını almaq üçün çox rahatdır.

Tam nümunə: hesablar arasında pul köçürməsi

Gəlin, hər şeyi birləşdirək. Budur, tam transaksiya nümunəsi — balans yoxlanışı, pul köçürməsi və səhv olarsa rollback imkanı ilə:

BEGIN;
-- Transaksiyaya başlayırıq

-- Hesabda balansı yoxlayırıq
SELECT balance INTO current_balance FROM accounts WHERE account_id = 1;

-- Yoxlayırıq, kifayət qədər vəsait var?
IF current_balance >= 100 THEN
    -- Əgər kifayət qədər vəsait varsa, köçürmə edirik
    UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
    UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
    COMMIT;
    -- Dəyişiklikləri təsdiqləyirik
ELSE
    -- Əgər kifayət qədər vəsait yoxdursa, transaksiyanı ləğv edirik
    ROLLBACK;
END IF;

Bu nümunə göstərir ki, transaksiya komandaları birlikdə işləyərək datanın uyğunsuzluğunun qarşısını alır.

Vacibdir

IF THEN ELSE END IF — bunlar stored procedure əməliyyatlarıdır, bir neçə səviyyə sonra bunları ayrıca öyrənəcəyik:P

Autocommit ayarının özəlliyi

PostgreSQL-də default olaraq autocommit rejimi aktivdir, yəni açıq transaksiyasız komandalar dərhal database-ə yazılır. Məsələn:

UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- Dəyişikliklər dərhal saxlanılır, hətta COMMIT olmadan

Əgər transaksiyaları özün idarə etmək istəyirsənsə, həmişə BEGIN ilə transaksiyanı açmaq tövsiyə olunur.

Hazırkı sessiya üçün autocommit-i bu komanda ilə söndürə bilərsən:

SET AUTOCOMMIT TO OFF;

Unutma: əgər autocommit söndürülübsə, hər sessiyanı COMMIT və ya ROLLBACK ilə bitirməlisən.

Transaksiyalarla işləyərkən tipik səhvlər

Unudulmuş COMMIT. Əgər COMMIT etməyi yaddan çıxarsan, dəyişikliklərin tamamlanmamış qalacaq və sessiya bitəndə itəcək.

Bloklanmalar. Transaksiya bitməyənə qədər istifadə etdiyi resurslar blokda qala bilər. Bu, dataya paralel çıxışda problemlər yarada bilər.

Artıq ROLLBACK. Bəzən proqramçılar həddindən artıq ehtiyatlı olur və transaksiyanı səbəbsiz rollback edirlər. Bu isə təkrar hesablama və database-ə əlavə yük gətirir.

Asılı qalmış transaksiyalar. Əgər transaksiyanı başladıb, amma nə COMMIT, nə də ROLLBACK etməyi unutsan, sessiya asılı qalacaq və database resursları bloklanacaq.

Praktik tətbiq

Developer və ya DBA (database administratoru) müsahibəsində səndən PostgreSQL-də transaksiyaların necə işlədiyini soruşa bilərlər. BEGIN, COMMITROLLBACK komandalarını başa düşmək, datayla təhlükəsiz və effektiv işləyə bildiyini göstərir.

Real həyatda transaksiyalar xüsusilə etibarlı sistemlər qurmaq üçün lazımdır, məsələn, online mağazalarda sifarişlərin işlənməsi və ya loyallıq proqramında bonus xallarının hesablanması üçün.

Artıq transaksiyaların əsas komandalarını başa düşürsən, indi daha maraqlı mövzulara — SAVEPOINT istifadəsi və isolation səviyyələri ilə işləməyə keçə bilərik. PostgreSQL — sonsuz imkanlar dənizidir, hazır ol!

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION