Modül dersleri (4/4)
İşlemler: ya hep ya hiç
İşlem, veritabanının işlem olarak kabul ettiği bir işlemler grubudur.
tek bir birim: ya hepsi başarılı olur ya da hiçbiri bir
iz. Bir dizi olduğunda kendinizi tutarsızlıklardan bu şekilde korursunuz.
UPDATE/INSERT/DELETE tutarlı kalmalıdır.
Sözdizimi
BEGIN; -- apri la transazione
UPDATE …;
INSERT …;
DELETE …;
SELECT …; -- puoi anche solo leggere
COMMIT; -- conferma tutte le modifiche
-- oppure
ROLLBACK; -- annulla tutte le modifiche, come se nulla fosseBEGIN ve COMMIT arasındaki her şey atomiktir: başka bağlantı yoktur
ara durumu görür. Program çökerse veya çalışırsa
ROLLBACK, veritabanı tam olarak BEGIN öncesinde olduğu gibi kalır.
Klasik senaryo: transfer
Kanonik örnek, ürünler (veya bir para birimi) arasında bir hisse senedi transferidir.
hesaplar arası transfer): birlikte başarılı olması gereken iki UPDATE,
asla biri evet diğeri hayır.
BEGIN;
UPDATE products SET stock = stock - 1 WHERE id = 1;
UPDATE products SET stock = stock + 1 WHERE id = 2;
COMMIT;İkinci UPDATE başarısız olursa (örneğin, CHECK kısıtlama hatası), bir
ROLLBACK ürün 1'in stokunu orijinal değerine geri yükler.
ROLLBACK: DBA'nın hata ayıklayıcısı
BEGIN;
UPDATE customers SET city = 'X' WHERE id = 1;
SELECT first_name, city FROM customers WHERE id = 1; -- "vedo come è cambiato"
ROLLBACK;Gerçek veriler üzerinde UPDATE denemek için çok kullanışlı bir model: siz
çalıştırın, aynı işlemde sonucu SELECT ile inceleyin ve
eğer sizi ikna etmezse, siz ROLLBACK — veritabanı tam olarak aynı
daha önceydi.
KAYIT NOKTASI: kısmi geri alma
Bir işlemin içinde ara noktalar oluşturabilirsiniz:
BEGIN;
UPDATE customers SET city = 'A' WHERE id = 1;
SAVEPOINT step1;
UPDATE customers SET city = 'B' WHERE id = 2;
-- mi sono accorto che il secondo UPDATE è sbagliato:
ROLLBACK TO SAVEPOINT step1;
COMMIT; -- solo il primo UPDATE viene confermato30 saniyede asit
İşlemler ACID özelliklerini garanti eder:
- Atomicity — ya hep ya hiç;
- Ctutarlılık — kısıtlamalar işlemin başında ve sonunda karşılanır;
- Isolation — eşzamanlı işlemler ara durumları görmez (çeşitli "düzeylerde");
- **Dayanıklılık — başarılı bir
COMMITçarpışma durumunda bile kaybolmaz.
Sıra sende
Tek bir işlemde: 1. ürünün stokunu 1 azaltın ve 2. ürünün stoğunu 1 artırın. BEGIN ile açın ve COMMIT ile kapatın.
İpucu göster
İlgili SET maddelerinde referans stok - 1 ve stok + 1.
3 denemeden sonra çözüm mevcut
Alıştırmayı gözden geçirin
Bir işlem açın, id=1 olan müşterinin şehrini 'Sperimentale' olarak güncellemeyi deneyin, ardından ROLLBACK ile işlemi iptal edin. Sonunda müşteri 1'in şehri orijinal şehir ('Milano') olmalıdır.
İpucu göster
ROLLBACK, BEGIN'den itibaren yapılan her değişikliği iptal eder.
3 denemeden sonra çözüm mevcut