Kursumuzda transaksiyalara üç dəfə toxunacağıq. Hər dəfə də nəsə yeni bir şey öyrənəcəyik. İndi transaksiyaların əsaslarını öyrənirik. Kursun ikinci yarısında transaksiyaların izolyasiya səviyyələrini, ən sonda isə nested transaksiyaların incəliklərini başa düşəcəyik.
Transaksiya nədir
Gəlin sadədən başlayaq — tərifdən. Transaksiya — yalnız birlikdə yerinə yetirilən əməliyyatlar qrupudur. Hamısı bir yerdə.
Bundan vacib nəticə çıxır: əgər qrupdakı hər hansı (hansısa!) əməliyyat uğursuz olarsa, bütün digər əməliyyatların nəticəsini geri qaytarmaq və sistemi ilkin vəziyyətə qaytarmaq lazımdır.
SQL baxımından, transaksiya — əməliyyatlar toplusudur (məsələn, insert, update və ya delete), hansı ki, ya transaksiyanın içindəki bütün əməliyyatlar uğurla başa çatır, ya da heç biri icra olunmur. Bu davranış baza məlumatları ilə işləməyi etibarlı və uyğun edir, xüsusilə də ödənişlərin işlənməsi və ya əlaqəli məlumatların yenilənməsi kimi kritik hallarda.
Təsəvvür elə, iki bank hesabı arasında pul köçürürsən. Sadə dillə desək, iki ardıcıl əməliyyat var:
- Bir hesabdan məbləğ çıxılır.
- O biri hesaba eyni məbləğ yatırılır.
Əgər əməliyyatın sonunda (məsələn, server çökərsə) problem olsa, heç bir istifadəçi ziyana düşməməlidir. Başqa sözlə, ya hər iki addım uğurlu olur (transaksiya təsdiqlənir), ya da hər ikisi geri qaytarılır (transaksiya ləğv olunur).
Transaksiyalar və ACID prinsipləri
Transaksiyalar ACID prinsiplərinə əsaslanır, hansı ki, dörd əsas xüsusiyyəti xatırladır:
- Atomicity (Atomluq): ya hamısı, ya heç nə. Transaksiyanın içindəki bütün əməliyyatlar ya icra olunur, ya da geri qaytarılır.
- Consistency (Uyğunluq): məlumatlar transaksiyadan əvvəl və sonra düzgün vəziyyətdə qalır.
- Isolation (İzolyasiya): hər transaksiya sanki sistemdə tək işləyir kimi davranır.
- Durability (Davamlılıq): təsdiqləndikdən sonra məlumatlar saxlanılır, hətta server çökərsə belə.
Transaksiyaları idarə etmək üçün əsas komandalar
İndi praktika vaxtıdır! Transaksiyaları idarə etmək üçün əsas üç komanda bunlardır:
BEGIN
Yeni transaksiya başlayır. Sonrakı bütün əməliyyatlar onun çərçivəsində icra olunacaq.COMMIT
Dəyişiklikləri təsdiqləyir. Bu komandadan sonra bütün əməliyyatlar qalıcı olur.ROLLBACK
Dəyişiklikləri ləğv edir. Nəsə səhv getsə, transaksiyanı geri qaytarmaq olar və məlumatlar ilkin vəziyyətdə qalır.
Transaksiyaların əsas sintaksisi
Transaksiyanın sadə strukturu:
BEGIN;
-- burada sənin SQL əməliyyatların gedir
COMMIT;
ROLLBACK istifadəsinə nümunə:
BEGIN;
-- students cədvəlini dəyişirik
UPDATE students
SET grade = grade + 10
WHERE id = 1;
-- O! Başa düşdük ki, bu səhv idi.
ROLLBACK;
Real tapşırıqda transaksiyanın istifadəsinə nümunə
Tutaq ki, belə cədvəllərimiz var:
students:
| id | name | grade |
|---|---|---|
| 1 | Otto Lin | 85 |
| 2 | Anna Song | 90 |
courses:
| course_id | course_name |
|---|---|
| 1 | Riyaziyyat |
| 2 | Tarix |
Tutaq ki, tələbəni kursa yazdırmaq və onun orta balını eyni anda yeniləmək istəyirik:
BEGIN;
-- Addım 1: "kurslara yazılış" cədvəlinə qeyd əlavə edirik
INSERT INTO course_enrollments (student_id, course_id)
VALUES (1, 2);
-- Addım 2: Tələbənin orta balını yeniləyirik
UPDATE students
SET grade = grade + 5
WHERE id = 1;
COMMIT;
Bəs server birinci və ikinci addım arasında çökərsə nə olacaq? Əgər transaksiya istifadə etməsəydik, məlumatlar uyğunsuz vəziyyətdə qalardı: kursa yazılış əlavə olunar, amma orta bal yenilənməzdi. Amma transaksiya ilə hər iki əməliyyat ya baş tutur, ya da hər ikisi ləğv olunur.
Transaksiyalarda səhvlərlə işləmək
Bəzən nəsə səhv gedir və səhvi düzgün idarə etmək lazımdır. PostgreSQL-də səhv baş verərsə, transaksiya avtomatik olaraq geri qaytarılır.
Gəlin bilərəkdən səhv edək və baxaq nə baş verir. Təsəvvür elə ki, course_enrollments cədvəlində student_id sütununda unikallıq məhdudiyyəti var. Gəlin təkrar sətri əlavə etməyə çalışaq:
BEGIN;
INSERT INTO course_enrollments (student_id, course_id)
VALUES (1, 2);
-- TRANSAKSIYANIN SONU (hələ icra olunmayıb)
COMMIT;
Əgər artıq kursa yazılmış tələbəni əlavə etsək, səhv baş verəcək və PostgreSQL transaksiyanı avtomatik olaraq rollback edəcək.
ROLLBACK ilə əl ilə geri qaytarma
Çox vaxt səhvləri qabaqcadan bilmək olmur və nəsə səhv getsə, transaksiyanı geri qaytarmaq istəyirsən:
BEGIN;
-- Yeni tələbə əlavə edirik
INSERT INTO students (name, grade)
VALUES ('Omori Sanny', 75);
-- Oops! Başa düşdük ki, tələbəni təsadüfən əlavə etmişik.
ROLLBACK;
ROLLBACK komandasından sonra cədvəl dəyişmir — Omori Sanny students cədvəlində görünmür.
Faydalı məsləhətlər və tipik səhvlər
Transaksiyalarla işləmək asanlaşır, əgər bir neçə vacib qaydanı yadında saxlasan:
- Əməliyyatın bir neçə addımı varsa, xüsusilə bir neçə cədvəldə məlumat dəyişirsə, həmişə transaksiya istifadə et.
- Dəyişiklikləri təsdiqləməyi (
COMMIT) heç vaxt unutma. Yoxsa transaksiya tamamlanmamış qalacaq və məlumatlar dəyişməyəcək. - Mürəkkəb əməliyyatları transaksiyaya bürümək məlumatların uyğunluğunu qorumağa kömək edir.
- Hər hansı mərhələdə səhv görsən,
ROLLBACKistifadə etməkdən çəkinmə.
Artıq bilirsən ki, transaksiyalarla əməliyyatlara necə nəzarət etmək olar, indi bu bilikləri praktikada yoxlamaq və məlumatların bütövlüyünü təmin etmək üçün transaksiyaları öyrənməyə davam etmək vaxtıdır!
GO TO FULL VERSION