Transaction’ın kelime anlamı işlem, iş görmedir. Yani veri bloğuna yapılan işlemdir diyebiliriz. Bir grup DML deyiminin session tarafından execute edilmesidir.
Update, Delete, Insert, Merge, Select For Update, Lock Table deyimlerinden biri ile başlar. Commit ya da rollback ile biter.
‘A’ (Atomicity): Bir tansactionın ya tamamen olması ya da hiçbir işlemin yapılmamasıdır. Örneğin bankamatikten bir işlem yapan bir kişinin elektrilerin kesilmesi, cihazın bozulması vb durumlar ile yarıda kesilmiş bir işlem karşısında yaptığı işlemlerin hepsi rollback edilerek başlangıç durumuna geri döndürülmesi olayıdır.
Sağlıklı bir transaction Yarıda kesilen bir transaction
‘C’ (Concurency): Veri tabanı tutarlı veri sağlar.
‘I’ (Isolation) : Veritabanına birden fazla kullanıcı erişebilir. Birinin yaptığı işlemi diğerinin yaptığı işlem etkilemez.
Yukarıdaki örnekte A kişisi Mehmet’in salary bilgisini 500, b kişisi ise Ahmet’in salary bilgisini 300 olarak update işlemi yapıyor. Ama select ettiklerinde sadece kendi değişikliklerini görebiliyorlar çünkü henüz ikisi de commit işlemi yapıp transactionı bitirmediler.
Commit yaptıklarında yani transactionı bitirdiklerinde ise her iki değişikliği de görebilirler.
‘D’ (Durability): Commit edilen işlemlerin veritabanına işlendiğinden emin olunmasıdır.
Transaction Kontrol Deyimleri
• COMMIT : Unique system change number (SCN) atanır. Log writer process (LGWR), SGA’s redo log bufferları redo log file’lara yazar. Oracle rowlarda tutulan kilitleri serbest bırakır. Transactionı bitirir.
• ROLLBACK : Yapılanları geri alır. Rowlarda tutulan kilitleri serbest bırakır. Transactionı bitirir.
• SAVEPOINT : Transaction içinde bir point (noktayı) işaretlemeni sağlar. Bir den çok point de işaretlenebilir.
• ROLLBACK TO : Herhangi bir durumda istenildiğinde işaretlenen pointlere geri dönülmesi sağlar.
• SET TRANSACTION : Transactionın isolation levelının vb belirlenmesini sağlar.
- Isolation Level
- Specifying UNDO Segment
Farklı Atomicity’ler
Statement-Level Atomicity : Oracle, Sybase and SQL Server’s ların aksi şekilde hareket eder.
1: create table t2 ( cnt int );
2: insert into t2 values ( 0 );
3: commit;
1: create table t ( x int check ( x>0 ) );
1: create trigger t_trigger
2: before insert or delete on t for each row
3: begin
4: if ( inserting ) then
5: update t2 set cnt = cnt +1;
6: else
7: update t2 set cnt = cnt -1;
8: end if;
9: dbms_output.put_line( 'I fired and updated ' ||
10: sql%rowcount || ' rows' );
11: end;
1: insert into t values (1);
2: insert into t values(-1);
3: select * from t2;
Yukarıdaki gibi check constraint’li bir t tablosu, içinde 0 değeri olan bir t2 tablosu ve insert ve deleteden önce tetiklenecek bir trigger yaratalım. T tablosuna aşağıdaki gibi insert işlemlerini yapmaya çalıştığımızda ilk insertin yapıldığı ikincinin ise yapılmadığı görülmektedir. Yani ilk işlem başarı ile gerçekleşmiş ama oracle tarafından commit işlemi yapılmış kullanıcıya bırakılmıştır, ikincisinde ise işlem başarısız olmuştur.
Başarılı olan işlemler için commit ya da rollback yapmaz. Kullanıcıya bırakır.
Procedure-Level Atomicity : Kullanıcı bir kod bloğunu çalıştırır. Oracle çevresine savepoint yerleştirir.
1: create or replace procedure p
2: as
3:
4: begin
5:
6: insert into t values ( 1 );
7:
8: insert into t values (-1 );
9:
10: end;
11:
bir p procedure2u yaratalım ve çalıştıralım.
1: select * from t;
2: select * from t2;
sorgusu yaptığımızda görüldüğü gibi iki insertü de yapmamıştır. Çünkü ikinci insert hata verdiği için ardışık işlem kesintiye uğramış ve bu yüzden oracle procedure’un başına koyduğu savepointe geri dönmüştür.
1: begin
2:
3: savepoint sp;
4:
5: p;
6:
7: exception
8:
9: when others then
10: null;
11:
12: rollback to sp;
13:
14: end;
15:
1: begin
2: p;
3: exception
4: when others then null;
5: end;
6: /
7:
8: I fired and updated 1 rows
9: I fired and updated 1 rows
10:
11: PL/SQL procedure successfully completed.
12:
13: select * from t;
14:
15: X
16: ----------
17: 1
18:
19: select * from t2;
20:
21: CNT
22: ----------
23: 1
24:
1. insert işlemi gerçekleşir, ikinci de hata oluştuğu için exception bloğuna düşer.
Immediate Constraints :
Sql deyimi bittikten sonra integrity constraints kontrolü yapılır. Aşağıdaki örnekte t tablosu yaratılmış ve 1, 2 değerleri insert edilmiş. Aşapıdaki update işlemi çalıştırıldığında eğer her satırda constraints kontrolüü olsaydı ikinci satırda hata alınırdı ama sql deyimi bittikten sonra kontrol yapıldığı için işlem gerçeklenmekte.
1: create table t ( x int unique );
2:
3: insert into t values ( 1 );
4:
5: insert into t values ( 2 );
6:
7: update t set x = x+1;
8:
Kötü Transactionlar
- Loop içinde cmmit işlemi yapmak.
- Autocommit özelliğinin açık olması (default ).
1: INSERT INTO T SELECT OBJECT_NAME FROM ALL_OBJECTS;
2:
3: COMMIT;
4:
5: FOR x in (SELECT * FROM ALL_OBJECTS )
6:
7: LOOP
8:
9: INSERT INTO T VALUES ( x.object_name);
10:
11: COMMIT;
12:
13: END LOOP;
14:
Distributed Transactions
Uzak sunucuda da değişiklik yapılıyorsa ya ikisinde de yapar ya da hiçbirinde yapmaz(Atomicity). 2PC protokolünü kullanır.
DDL’ler kendi içinde commit yapar, commit yapılamadığından DDL de yapılamaz.
DDL yapılmasının tek yolu DBMS.JOB ya da Oracle 10g, the scheduler packageile gelen DBMS_SCHEDULER kullanılarak uzaktan bir iş tanımlanır ve bu işlem ile commit yapılabilir.
Autonomous Transactions
Sadece loglama işlemlerinde kullanımalıdır.Transaction içinde transaction yaratarak, commit ve rollback değişikliklerini parent transactiondan bağımsız gerçekleştirir.
Yazan : Bahar Gezici
http://www.bahargezici.com/post/2010/07/28/Turkcell-Staj-e28093-Transactions.aspx