PostgreSQL İzolasyon Seviyeleri: Transaction Çakışmalarını Yönetme
# PostgreSQL İzolasyon Seviyeleri: Transaction Çakışmalarını Yönetme
Birden fazla transaction aynı anda veri okuyup yazarsa sorun çıkar. Bir işlem diğerinin yarım kalan verisini okuyabilir, ya da aynı satırı iki kişi değiştirebilir. PostgreSQL bunu 4 seviye ile kontrol eder.
Tamamlanmamış verileri okur (Dirty Read riski). PostgreSQL'te pratikte READ COMMITTED gibi davranır.
Sadece tamamlanmış verileri okur. Ama aynı transaction içinde iki kez okuduğunda farklı sonuç çıkabilir (Non-repeatable Read).
Transaction başında snapshot alır. Aynı veri hep aynı şekilde görünür. Ama yeni satırlar eklenebilir (Phantom Read).
En katı seviye. Transactions sırayla çalışıyormuş gibi davranır. Çakışma varsa hata verir.
Bir banka hesabı senaryosu. İki transaction aynı anda para çekmeye çalışıyor:
Terminal 1 (Transaction A):
1BEGIN ISOLATION LEVEL READ COMMITTED;2SELECT bakiye FROM hesaplar WHERE id = 1;3-- Sonuç: 10004UPDATE hesaplar SET bakiye = bakiye - 500 WHERE id = 1;5COMMIT;Terminal 2 (Transaction B):
1BEGIN ISOLATION LEVEL READ COMMITTED;2SELECT bakiye FROM hesaplar WHERE id = 1;3-- Sonuç: 1000 (A'nın işlemi henüz bitmedi)4UPDATE hesaplar SET bakiye = bakiye - 300 WHERE id = 1;5COMMIT;Sonuç: Bakiye 200 olur (1000 - 500 - 300). Ama READ COMMITTED'de B, A'nın işlemini görmedi.
REPEATABLE READ ile:
1BEGIN ISOLATION LEVEL REPEATABLE READ;2SELECT bakiye FROM hesaplar WHERE id = 1;3UPDATE hesaplar SET bakiye = bakiye - 500 WHERE id = 1;4COMMIT;Her transaction kendi snapshot'ını görür. Çakışmalar daha az olur ama yine de phantom read riski vardır.
SERIALIZABLE ile:
1BEGIN ISOLATION LEVEL SERIALIZABLE;2SELECT bakiye FROM hesaplar WHERE id = 1;3UPDATE hesaplar SET bakiye = bakiye - 500 WHERE id = 1;4COMMIT;Eğer iki transaction aynı anda SERIALIZABLE ile başlarsa, biri bekler veya hata alır: `serialization failure`.
- Çoğu web uygulaması: READ COMMITTED yeterli
- Finansal işlemler: SERIALIZABLE
- Rapor/analiz: REPEATABLE READ
Yüksek seviye = daha güvenli ama daha yavaş.
0 yorum