İşlem izolasyonu, eşzamanlı işlemlerin birbirinin değişikliklerini nasıl gördüğünü etkiler. Bu, ACID özelliklerinin önemli bir parçasıdır. ANSI SQL'de dört temel izolasyon seviyesi bulunmaktadır:
Seçim, uygulamanın gereksinimlerine bağlıdır:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; -- Sonraki SELECT'ler "dondurulmuş" değerleri görecektir
"REPEATABLE READ seviyesi herhangi bir DB'de hayalet okumaları önleyebilir mi?"
Hayır. PostgreSQL ve bazı diğer veritabanlarında REPEATABLE READ seviyesi sadece kirli ve tekrar edilemeyen okumaları önler, ancak mutlaka hayalet okumalardan korumaz. MySQL/InnoDB'de REPEATABLE READ temelde SERIALIZABLE'dır, ancak diğer veritabanlarında değildir.
-- Bir işlem içinde SELECT * FROM orders WHERE amount > 100; okuyoruz; -- Diğer bir işlemde amount > 100 olan yeni bir değer ekleniyor ve onaylanıyor -- İlk işlem yeniden SELECT yaparken "hayalet" bir satırı görecektir, eğer izolasyon SERIALIZABLE'dan düşükse
Hikaye
Finans hizmeti yalnızca READ COMMITTED'i performans için kısıtladı — kullanıcı başka bir işlem tarafından değiştirilen bir tutarı gördü, bakiye farklılıkları ortaya çıktı.
Hikaye
Otel rezervasyon sisteminde aynı odanın çift rezervasyonu yapıldı — işlemler güncel rezervasyonların çıktısını izole etmedi, seviye READ COMMITTED idi.
Hikaye
MySQL'den PostgreSQL'e geçiş: Geliştirici REPEATABLE READ'in hayaletlerden koruduğunu düşündü, ancak geçiş sonrası bir işlemin içinde beklenmedik "askıda" siparişler görüldü.