Ana içeriğe geç
Modül 11 · Ders 1 ders 4Kurstaki 41/57~15 min
Modül dersleri (1/4)

ASİT işlemleri (BEGIN/COMMIT)

Herhangi bir veritabanı için güvenilirliğin temelleri ACID kısaltmasına dayanır:

  • Atomicity: bir işlem ya tamamen tamamlanır (Taahhüt) ya da geride yarım kalmış bir iz bırakmadan başarısız olur (Geri Alma).
  • Ctutarlılık: veritabanı kurallarına (ör. kısıtlamalar, Yabancı Anahtarlar) her zaman saygı gösterilir.
  • Isolation: Aynı anda gerçekleşen işlemler, kontrolsüz bir şekilde birbirine müdahale etmez.
  • Durability: Bir Taahhütten sonra değişiklik geri döndürülemez şekilde diske yazılır.

İşlem sözdizimi

Normalde her UPDATE veya DELETE sorgusu bağımsız bir işlem (otomatik taahhüt) olarak değerlendirilir. Ancak, örneğin müşterinin hesabını borçlandırmak ve sipariş vermek gibi birden fazla işlemi bir arada gruplamak istediğinizde, bunu işlem sözdizimini kullanarak açıkça yapmanız gerekir.

SQL
BEGIN;

UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);

COMMIT; -- Writes the changes

Bu karmaşık yürütmeler sırasında sorguyu gönderen JavaScript uygulaması bir sorun olduğunu fark ederse (örneğin, depoda yeterli stok olmaması ve çökmesi), aşağıdaki mesajı gönderir:

SQL
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the block

Kendin dene

Egzersiz#sql.m11.l1.e1
Denemeler: 0Yükleniyor…

Bir işlem açın.\nGeçici tabloda 'miktarını' 0'a ayarlayarak ürünü ID 10 ile güncelleyin (bekleme yok, ürünlerde 'miktar' yok, hadi icat edelim: 'order_items'de 'unit_price'ı değiştirin, ancak bu bir kısıtlama gerektirir.\nDaha iyisini yapalım: Sipariş ID 5'in durumunu 'gönderildi' olarak güncelleyin ve işlemi başarıyla tamamlayın.

Düzenleyici yükleniyor…
İpucu göster

BEGIN; ile başlayın, id = 5 siparişlerini status='shipped' olarak değiştirin, ardından COMMIT ile gönderin;

3 denemeden sonra çözüm mevcut

Egzersiz#sql.m11.l1.e2
Denemeler: 0Yükleniyor…

Üretimde panik! Bir geliştirici, WHERE olmadan bir DELETE yazdı ve geçmişteki tüm incelemeleri sildi.\nOnlara geri almanın nasıl yapıldığını gösterelim. Bir işlem başlatın, 'incelemelerdeki' her şeyi silen hızlı bir DELETE başlatın (WHERE cümlesi olmadan), ancak ardından bloğu tamamlamadan önce etkiyi geri almak için SQL cankurtaranını kullanın.

Düzenleyici yükleniyor…
İpucu göster

BEGIN;, 'incelemelerde' temiz sayfa silme ve ardından sihirli ROLLBACK; sonunda.

3 denemeden sonra çözüm mevcut