Oracle'yi Oracle yapan çok sevdiğim özelliklerden biri. Türkçeye
çoklu versiyonlama gibi ilginç bir şekilde çevrilebilir. Aynı anda veritabanının
farklı görünüşleri olarak ifade edilmesi daha güzel olacaktır kanaatimce. Oracle
içinde herhangi bir işlem yapmak istediğiniz zaman, commit veya rollback
yapmayıncaya kadar, diğer kullanıcılar tarafından görülmeyecektir. Aslında bir update
yaptığınızı zannedip commit etmediğiniz için dış kullanıcıların bunu
görmemesini sağlayabilirsiniz. O nedenle önemli bir konu olarak
değerlendirlmelidir.
Şimdi bir örnekle daha iyi ifade etmeye çalışalım.2 tane SQL Plus
açılmalı öncelikle. İlki için bir tane tablo oluşturalım:
create table t1(
plaka number,
sehir nvarchar2(32)
)
Tabloyu dolduralım:
DECLARE
i NUMBER;
BEGIN
i := 0;
WHILE (i < 100)
LOOP
INSERT INTO t1 (plaka, sehir) VALUES (i*100, 'Sehir_' ||
to_char(i));
i := i + 1;
END LOOP;
END;
Tabloyu kontrol edelim:
SELECT * FROM t1
Verilerimiz:
0 Sehir_0
100 Sehir_1
200 Sehir_2
300 Sehir_3
400 Sehir_4
En sonunda onaylayalım yaptıklarımızı:
commit
Şimdi ise ikinci SQL Pus ı açalım.Bir update yapalım:
UPDATE t1 SET plaka = plaka * 100
Tabloyu kontrol edelim:
SELECT * FROM t1
Verilerimiz:
0 Sehir_0
10000 Sehir_1
20000 Sehir_2
30000 Sehir_3
40000 Sehir_4
Şimdi kilit noktaya geliyoruz. Bu update’i commit etmeden, ilk SQL Plus
ekranından tabloyu kontrol ediyoruz:
SELECT * FROM t1
Verilerimiz:
0 Sehir_0
100 Sehir_1
200 Sehir_2
300 Sehir_3
400 Sehir_4
ilginç değil mi? Oysa az önce bunu update etmiştik. İşte Oracle bu noktada sizin
veritabanına bağlandığınız andan sonra commit edilmemiş hiç bir veriyi size
göstermiyor.Bu sayede tutarlı bir okuma sağlamış oluyor. İkinci SQL Plus tan bir commit cümlesi ile yaptıklarımızı onaylayalım:
commit
Artık Oracle biliyor ki, veriler onaylandı herkes yeni verilere ulaşabilir.İlk
SQL Plus ekranından şimdi bir okuma yaparsak:
SELECT * FROM t1
Verilerimiz:
0 Sehir_0
10000 Sehir_1
20000 Sehir_2
30000 Sehir_3
40000 Sehir_4
Yeni verileri görmüş oluruz.