27 Ekim 2011 Perşembe

Oracle Transaction Management

Transaction, basit anlamda veri tabanı işlemleridir.Birbiri ile ilgili kendi içinde anlamı vardır.Transaciton, bütün veritabanlarının temel bir özelliğidir.Daha küçük parçalara ayrılamayan en küçük işlem yığınına Transaction denir. Geçerli kabul edilmesi bir dizi işlemin tamamının yolunda gitmesine bağlı durumlarda transaction kullanılır.
Örneğin; bir havale işleminde, havale yapanın hesap bilgilerinden havale yaptığı miktar düşüldükten sonra, elektrik kesintisi, donanımsal veya yazılımsal bir arıza nedeniyle alıcının hesabına bu miktar eklenemez ise; gönderenin hesabından düşülen paranın iade edilmesi gerekir.Aksi halde bu paranın sahibinin kimliği kaybedilmiş olur. Bu da sistemin olası haller dışında veri kaybetmeye müsait bir durumda olması demektir. Bu tür aksaklıklar transaction kavramı sayesinde kontrol altına alınır.
 




















           Transaction bloğu ya hep ya hiç mantığı ile çalışır. Ya tüm işlemler düzgün olarak gerçekleşir ve geçerli kabul edilir veya bir kısım işlemler yolunda gitse bile, blok sona ermeden bir işlem bile yolunda gitmese hiçbir işlem olmamış kabul edilir.

Veritabanı işlemleri, ACID özelliklerini tarafından açıklanan özelliklerini göstermelidir.

ACID properties
Atomicity: Bir işlem ya tamamen gerçekleşir ya da hiçbir gerçekleşmez.Ya hepsi ya hiç.(– A transaction either happens completely, or none of it happens.)

Consistency(tutalılık): Bir veritabanı işlemi veritabanını tutarlı bir noktadan diğer bir tutarlı noktaya taşır.(– A transaction takes the database from one consistent state to the next)

Isolation(ayırma) : Bir veritabanı işlemi COMMIT ile sonuçlanana kadar yaptıkları diğer oturumlarda görünür değildir(– The effects of a transaction may not be visible to other transactions until the transaction has committed)

Durability (süreklilik,kalıcılık): Başarı ile COMMIT edilmiş bilgisi alınan bir veritabanı işlemi kalıcıdır, kaybedilemez.(– Once the transaction is committed, it is permanent)

Transaction Control Statements (Veritabanı İşlemleri Denetim Cümleleri)
COMMIT: Veritabanı işlemini sonlandırır, değişiklikleri kalıcı kılar.(-Ends transaction and makes any changes permanent.)

ROLLBACK: Veritabanı işlemini sonlandırır, değişiklikleri geri sarar.(-Ends transaction and undoes any uncommitted changes.)

SAVEPOINT:Bir veritabanı işlemi içinde işaretli noktalar yaratmak için kullanılır, birden fazla işaret noktası yaratılabilinir.Savepointler, transactionların içinde dönüş noktaları belirlememizi sağlar. Yani, herhengi istemediğimiz bir değişiklik olduğunda eğer bazı noktalara savepoint koymuşsak, bütün transaction'u rollback yapmak zorunda kalmaz, istediğimiz savepoint'deki duruma dönebiliriz. (-Marked point in a transaction and may be given more than one in a single transaction.)

ROLLBACK TO <SAVEPOINT>: Belirtilen işaretli noktaya geri sarma için kullanılır.(-Rolls back the transaction until the stated save point .)

SET TRANSACTION: Birçok veritabanı işlem özelliğinin(sadece okuma ve okuma-yazma gibi) değiştirilmesi için kullanılabilir.Dahası ,özel bir roll back segmenti kullanılması için transaction'a talimat verilir.(-Sets various transaction attributes (read-only or readwrite, etc.). Also, instruct the transaction to use a specific rollback segment.)

When A transaction starts? (Bir Transaction Ne zaman başlar?)
Bir transaction çalıştırabilir ilk SQL deyimiyle başlar. (-A transaction begins with the first executable SQL statement.)

When A transaciton ends? (Bir Transaction ne zaman sona erer?)

  • Bir transaction COMMIT veya ROLLBACK işlemi ile tamamlanır.(-A Transaction ends a COMMIT or a ROLLBACK statement .)
  • Bir DDL cümleri kullanıldığında.Çünkü, DDL çalıştırma aşamasının ilk adımı örtülü bir COMMIT’dir.(-When a DDL statement is issued.Because,First step of DDL statement is an implicit commits.)
  • Bir kullanıcı Oracle'dan bağlantısının kesildiğinde.Transaction COMMIT edilir.(-A user disconnects from Oracle.Transaction is committed.)
  • Bir kullanıcı prosesi anormal bir şekilde sonlandığında.Transaction ROLL BACK edeilir.(-A user process terminates abnormally.Transaction is rolled back.)

    Örneğin: SQL> UPDATE employees SET salary=salary;
    35 rows updated.
    SQL> SELECT XID, STATUS FROM V$TRANSACTION;
    XID STATUS
    ---------------- ----------------
    05000B0034010000 ACTIVE
    SQL> ROLLBACK;
    Rollback complete.
    SQL> SELECT XID FROM V$TRANSACTION;
    no rows selected

     
    Commit
  • Transaction içinde işlemen komutların, yapılan değişikliklerin kalıcı hale getirilmesi demektir.Oracle'da, bir transaction başladığında, çalıştırılan komutlar ve etkileri diğer kullanıcılara yansımaz.Diğer kullanıcılar her zaman son commit edilmiş tutarlı veriyi görür!!!
  • Transaction ile yapılan değişiklikler Data Buffer Cache'e ve redo log'lara yazılır, orjinal veriler ise undo log'lara yazılır.Commit edildikten sonra Transactionın özgü SCN(System Change Number ) atanır ve kayılar tabloya yazılır.Satır ve tablo üzerinde kilitler kaldırılır.Oracle Transaction'ı işlenemiş olarak işaretlenir.
  • Oracle için , COMMIT hızlı bir işlemdir, çünkü o ana kadar veritabanı gerekli ön hazırlığı iyimser bir şekilde yapmıştır.
  • Bir veritabanı uygulama geliştiricisi COMMIT sürecini anlamalıdır, daha sık COMMIT etmek, COMMIT süresine olumlu etkilemez!!!.

Rollback

  • Rollback komutu girildiğinde, undo bufferdaki bilgiler data buffer'a yazılır. Dolayısıyla, üzerinde değişiklik yapılan veri ne kadar büyükse rollback o kadar uzun sürer. Rollback'in tamamlanma süresi commit'ten fazladır
  • Tüm Transaction'ların veri kilidini kaldırır.Transaction sonlanır
  • Oracle için , ROLLBACK ise daha yavaş ve pahallı bir işlemdir, çünkü o ana kadar yapılan tüm hazırlığın cidden geri alınması gerekir.

Örneğin;

SQL*Plus: Release 10.2.0.1.0 - Production on Per Eki 27 16:13:18 2011

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Bağlantı:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> create table employees (id int, name varchar2(30), salary int);

Tablo yaratıldı.

SQL> insert into employees Values (1,'erdi','3000');

1 satır yaratıldı.

SQL> select * from employees;

ID NAME SALARY
---------- ------------------------------ ----------
1 erdi 3000

SQL> Rollback;

Geri alma tamamlandı.

SQL> select * from employees;

satır seçilmedi

SQL> insert into employees Values (1,'murat','1600');

1 satır yaratıldı.

SQL> Commit;

Kaydetme tamamlandı.

SQL> Rollback;

Geri alma tamamlandı.

SQL> select * from employees;

ID NAME SALARY
---------- ------------------------------ ----------
1 murat 1600

SQL>



Statement-Level Rollback
  • Eğer herhangi bir zamanda çalışan SQL cümlesi bir hataya neden olmuşsa, ya hepsi değiştirilir.Bu operasyona statement-level rollback denir.
  • Çalışma esnasında hata tesbit edilise rollback edilir.Örneğin bir primary key'e aynı değeri girme hatası gibi.
  • Bir komuttan dolayı trigger çalışmış veya prosedür çağrılmışsa, bir hata durumunda o komutun bütün etkileri geri alınır.
  • Eğer Sql cümlesinin ayrışması anında yani syntax hatası gibi hata varsa o zaman rollback'e neden olmaz.

Resumable Transaction
  • Bazı şartlarda bazı hatalardan dolayı yarım kalan transaction'umuza devam edebilmemiz anlamına gelir.
  • Alan dışı koşullarda ,Maximum extente ulaşma koşullarında ve kotayı aşma durumlarında transaction hata verip işlemi geri almak yerine belirli bir süre bekler.
  • Örneğin;O beklerken kotanın arttırılması gibi olayı kısıtlayan neden ortadan kaldırılırsa işlemini kaldığı yerden tamamlar:
    ALTER SESSION ENABLE RESUMABLE TIMEOUT 10800;

Savepoint
  • Savepoint uzun Transactionları daha küçük kısımlara böler.
  • Transactionların içinde dönüş noktaları belirlememizi sağlar. Yani, herhengi istemediğimiz bir değişiklik olduğunda eğer bazı noktalara savepoint koymuşsak, bütün transaction'u rollback yapmak zorunda kalmaz, istediğimiz savepoint'deki duruma dönebiliriz.

Örneğin;

SQL*Plus: Release 10.2.0.1.0 - Production on Per Eki 27 16:28:12 2011


Copyright (c) 1982, 2005, Oracle. All rights reserved


Bağlantı:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options


SQL> insert into employees values (3, 'Ali', 2000);


1 satır yaratıldı.


SQL> Select * from employees;


ID NAME SALARY
---------- ------------------------------ ----------
3 Ali 2000


SQL> Savepoint sp1;


Kayıt noktası yaratıldı.


SQL> insert into employees values (2,'Erdi', 3000);


1 satır yaratıldı.


SQL> Select * from employees;


ID NAME SALARY
---------- ------------------------------ ----------
3 Ali 2000
2 Erdi 3000


SQL> Savepoint sp2;


Kayıt noktası yaratıldı.


SQL> insert into employees values (4,'Hasan', 1500);


1 satır yaratıldı.


SQL> Select * from employees;


ID NAME SALARY
---------- ------------------------------ ----------
3 Ali 2000
2 Erdi 3000
4 Hasan 1500


SQL> Savepoint sp3;


Kayıt noktası yaratıldı.


SQL> insert into employees values (5, 'Yiğit', 2000);


1 satır yaratıldı.


SQL> Select * from employees;


ID NAME SALARY
---------- ------------------------------ ----------
3 Ali 2000
2 Erdi 3000
4 Hasan 1500
5 Yigit 2000


SQL> Rollback to sp3;


Geri alma tamamlandı.


SQL> Select * from employees;


ID NAME SALARY
---------- ------------------------------ ----------
3 Ali 2000
2 Erdi 3000
4 Hasan 1500


SQL> Rollback to sp2;


Geri alma tamamlandı.


SQL> Select * from employees;


ID NAME SALARY
---------- ------------------------------ ----------
3 Ali 2000
2 Erdi 3000


SQL> Rollback to sp1;


Geri alma tamamlandı.


SQL> Select * from employees;


ID NAME SALARY
---------- ------------------------------ ----------
3 Ali 2000


SQL>


Autonomous Transactions
  • Autonomous Transactions bağımsız Transaction'lardırd.Diğer bir transaction tarafından çağrılabilir
  • Stored procedure or function, Local procedure or function, Package, Type method ve Top-level anonymous block hepsi autonomous transactiondır.
  • Örneğin, transaction'ımızın içinden, otonom tanımlanmış bir procedure çağırdığımıza, o prosedür sonlanmış ve kendini commit etmişse, biz rollback dediğimizde onun etkileri geri alınmaz.Autonomous transaction kullandığımızda çok dikkatli olmamız gerekir.

Örneğin;

SQL*Plus: Release 10.2.0.1.0 - Production on Per Eki 27 16:48:32 2011


Copyright (c) 1982, 2005, Oracle. All rights reserved.




Bağlantı:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options




SQL> insert into employees values (1, 'Ali', 2000);


1 satır yaratıldı.


SQL> Select * from employees;


ID NAME SALARY
---------- ------------------------------ ----------
1 Ali 2000


SQL> DECLARE
2 PRAGMA AUTONOMOUS_TRANSACTION;
3 BEGIN
4 insert into employees values (2,'Erdi', 3000);
5 COMMIT;
6 END
8 /


PL/SQL yordamı başarıyla tamamlandı.


SQL> Select * from employees;


ID NAME SALARY
---------- ------------------------------ ----------
1 Ali 2000
2 Erdi 3000


SQL> insert into employees values (3,'Hasan', 1500);


1 satır yaratıldı.


SQL> Select * from employees;


ID NAME SALARY
---------- ------------------------------ ----------
3 Hasan 1500
1 Ali 2000
2 Erdi 3000


SQL> Rollback;


Geri alma tamamlandı.


SQL> Select * from employees;


ID NAME SALARY
---------- ------------------------------ ----------
2 Erdi 3000


SQL>

Görüldüğü gibi Rollback, Autonomous Transactions eklediğimiz kayıdı etkilemedi.

Two-Phase Commit Mechanism

  • Farklı makinalarda değişikliğe neden olan distributed transactions durumlarında, iki makinanın birbirine paralel olarak commit etmesi demektir. Commit komutu verildiğinde, birinde commit olmuşsa, diğeri de commit olmuş demektir. Herhangi birinde hata alınırsa diğeri de rollback edilir. Ya ikisi de gerçekleşir yada hiç gerçekleşmez. Transaction'un bütünlüğü korunur.


Kaynakça:

Hiç yorum yok:

Yorum Gönder