CodeGym /Kurslar /SQL SELF /Daxili tranzaksiyalar: SAVEPOINT, ROLLBACK TO SAVEPOINT

Daxili tranzaksiyalar: SAVEPOINT, ROLLBACK TO SAVEPOINT

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

PostgreSQL-də ƏSL daxili tranzaksiyalar standart mənada YOXDUR. Sadəcə xarici tranzaksiya və onun içində "qat-qat" savepoint-lər var.

"Daxili tranzaksiyalar" termini PostgreSQL-də adətən savepoint-lərdən istifadəni nəzərdə tutur, yəni SAVEPOINT, ROLLBACK TO SAVEPOINT, RELEASE SAVEPOINT komandaları ilə. Bunlar ayrıca, müstəqil tranzaksiyalar deyil, bir xarici tranzaksiyanın içində xüsusi nəzarət nöqtələridir ki, ora qayıtmaq olar, amma bütün tranzaksiyanı tam geri qaytarmadan.

Həyatdan bir analogiya: böyük bir mətn yazırsan və arada ctrl+s edirsən. Səhv eləsən, əvvəlki saxlanılmış versiyalardan birinə qayıda bilərsən, bütün işi itirmədən.

Savepoint-ləri idarə etmək üçün komandalar

Daxili tranzaksiyaları idarə etmək üçün PostgreSQL əsasən üç komanda verir:

SAVEPOINT

Bu komanda "savepoint" yaratmaq üçündür, lazım olsa ora qayıda bilərsən. Bu nöqtə tranzaksiyada bir nəzarət nöqtəsi kimi işləyir.

SAVEPOINT mypoint;

ROLLBACK TO SAVEPOINT

Göstərilən nöqtədən sonra edilən dəyişiklikləri geri qaytarır, amma həmin xarici tranzaksiyada əvvəlki dəyişikliklər toxunulmaz qalır.

ROLLBACK TO SAVEPOINT mypoint;

RELEASE SAVEPOINT

Savepoint-i silir. Bundan sonra ora qayıtmaq mümkün deyil.

RELEASE SAVEPOINT mypoint;

Nümunə: bir neçə cədvələ məlumat əlavə etmək və geri qaytarmaq imkanı

Tutaq ki, sən sifariş idarəetmə sistemi qurursan və eyni anda iki cədvələ məlumat yazmalısan: ordersorder_items. Birində səhv olsa, digər cədvəldəki məlumatlar geri qaytarılmamalıdır.

BEGIN; -- Tranzaksiyanın başlanğıcı

-- Savepoint yaradırıq
SAVEPOINT before_order;

-- Sifarişi orders cədvəlinə əlavə edirik
INSERT INTO orders (order_id, customer_id, date)
VALUES (1, 101, CURRENT_DATE);

-- Əgər burada səhv olsa — geri qayıdırıq
SAVEPOINT before_order_items;

-- Məhsulları order_items cədvəlinə əlavə edirik
INSERT INTO order_items (order_id, product_id, quantity)
VALUES (1, 2001, 4);

-- Əgər nəsə düz getməsə
-- ROLLBACK TO SAVEPOINT before_order_items;

-- Tranzaksiyanı təsdiqləyirik (dəyişiklikləri saxlayırıq)
COMMIT;

Əgər order_items cədvəlinə yazanda səhv olsa, before_order_items savepoint-ə qayıda bilərsən və orders cədvəlindəki dəyişikliklər qalacaq.

Praktik məsləhətlər və tipik səhvlər

Artıq başa düşdün ki, SAVEPOINTROLLBACK TO SAVEPOINT necə işləyir, indi bir neçə məsləhət, ki, problemlərdən qaçasan:

  1. Savepoint adları. SAVEPOINT üçün aydın və unikal adlar seç. Məsələn, before_insert, step1 və s. — bu, debug zamanı kömək edəcək.
  2. Savepoint-i unutma sil. Əgər artıq ora qayıtmaq fikrin yoxdursa, RELEASE SAVEPOINT ilə savepoint-i sil, tranzaksiyanı zibilləmə.
  3. Daxili tranzaksiya ≠ ayrıca tranzaksiya. Yadda saxla ki, COMMIT çağıranda bütün savepoint-lər silinir. Xarici COMMIT edildisə, artıq geri qayıtmaq olmur.
  4. Məlumatların bloklanması. Savepoint-ə qayıtsan belə, tranzaksiya çərçivəsində qoyulan bloklar qalır. Bu, multi-user mühitdə vacibdir.

SAVEPOINT və ROLLBACK TO SAVEPOINT ilə daxili tranzaksiyalar dev-lərə çətin situasiyaları idarə etmək üçün güclü alət verir. İndi tranzaksiyaları mərhələlərə bölə, səhvləri rahat həll edə və lazımsız rollback-lərdən qaça bilərsən. Yadda saxla: hər dəfə "rollback" görsən, panikaya düşmək lazım deyil — bəzən rollback etmək ən yaxşı çıxış yoludur.

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