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.
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);
COMMIT; -- Writes the changesBu 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:
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the blockKendin dene
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.
İ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
Ü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.
İpucu göster
BEGIN;, 'incelemelerde' temiz sayfa silme ve ardından sihirli ROLLBACK; sonunda.
3 denemeden sonra çözüm mevcut