15 Ekim 2020 Perşembe

ACID - Phantom Read Nedir ? (Eksik veya fazla satır)

Giriş
Şeklen şöyle

Açıklaması şöyle
A phantom read occurs when two identical queries are executed during a transaction and the row collection returned by the second query is different from the first

Phantom Read 2 şekilde ortaya çıkar
1. Belli bir koşula bakılarak satır eklenmesi/çıkarılması
1. Belli bir koşula bakmadan satır eklenmesi/çıkarılması

1. Belli bir koşula bakılarak satır eklenmesi/çıkarılması
Açıklaması şöyle. Burada SELECT ile bir koşula veya sayaç değerine bakılıyor. Daha sonra satır ekleniyor/çıkartılıyor
Having said that, a phantom read would always follow the same pattern
1. Run a SELECT query to get data that matches certain conditions.
2. Depending on the result of first the transaction either proceeds or aborts.
3. If the transaction proceeds ahead then you make some INSERT, UPDATE, DELETE call and commits the transaction.
Açıklaması şöyle
This is a very common problem and can happen in these sort of systems
1. Booking system (Two people book the same room)
2. User management system (Two people get the same username)
3. Customer service system (One agent gets assigned multiple calls at the same time)
Örnek
Bir örnek şöyle
The item count is 1 in the database.
1. User 1 fetches the count and gets 1 in return.
2. User 2 fetches the count and gets 1 in return.
3. User 1 sees count > 0, assumes the item is available and places the order, and decrements the count by 1.
4. User 2 sees count > 0, assumes the item is available and places the order, and decrements the count by 1.
5. User 1 order placed.
6. User 2 order placed.
Açıklaması şöyle
So both the user was actually able to book the item even though only 1 item was available. ... In simple words, multiple transactions read the same object to decide if a transaction should go through and then might update that or other objects.

2. Belli bir koşula bakmadan satır eklenmesi/çıkarılması
Açıklaması şöyle
This can happen if T1 queries some range of rows (say N rows), and meanwhile, T2 inserts an extra row matching the same query conditions of T1.
Then if T1 searches again, it will get an additional row(phantom read).
Kısaca aynı transaction içinde aynı sorguyu iki defa çalıştırıp, bir başka transaction'ının satır ekleyip silmesi yüzünden, eksik veya fazla satır sayısının alınması anlamına geliyor

Burada dikkat edilmesi gereken şey her iki sorguda da mevcut olan satırların aynı değerlere sahip olmasının garanti edilmesi. Sadece aradaki satırlar eklenip çıkarılabiliyor. Aynı değere sahip olmasının garanti edilmesi Read Committed Seviyesinde Select başlığındaki SCN numarası ile alakalı.

- Eksik veya fazla satırın olması select sum(x) from table; gibi sql cümlelerinde probleme sebep olabilir.

- Eğer primary key kullanarak tek bir satır çekiyorsak phantom read olma olasılığı ortandan kalkar.

Örnek
Bir örnek burada

Çözüm
1. "Select For Update" Kullanılabilir. "Select For Update" dokunduğu her satırı kilitleyeceği için, arkadan gelen transaction beklemek zorunda kalır.

2. Serializable Isolation Level kullanılabilir.

Hiç yorum yok:

Yorum Gönder