İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır

Transaction

Transaction Kavramı

Terim olarak 'işlem' anlamına gelen transaction aynı zamanda birbirleriyle ilişkili işlemler bütünü anlamına gelir. Bütünlük, biri işlemlerden bir bile olmadan bütün işlemlerin var olamayacağı, geçerli olamayacağı anlamına gelir. Bir bankadan hesabuından ötekine para transferi yapılacak olsun. İlk işlem bir hesaptan para çekmek, sonraki işlem de diğerine para yatırmaktır. Bir aksilik oldu ilk hesaptan çekildi bağlantı koptu. Diğerine para yatırılmadan. Bu durumda hesaplarda tutarszlık olacaktır. Yatrıma işlemi gerçekleşmediyse para çekme işleminin de geçersiz olması gerekir. İşte bu şekilde bir bütün halinde değerlendirilmesi gereken işlemler transaction'dır.

Veritabnaı veya veritabanıona erişen kütüphaneler hangi veritabanı işlemlerinin kendi aralarında bir bütün oluşturduğunu anlayamaz. Programcı işlem başlayacağı zaman başla (begin()) der. İşlem bittiğinde de teslim et (commit() ). Bir hata olursa da geriye dön ( rollback() ) denir. Tipik bir transction kod şu şekilde olur :

try{
	transaction.begin()
	do_operations();
	transaction.commit();
}catch(Exception e)
	transction.rollback();
}

JDBC Transaction'ları ve JTA Transaction'ları

JDBC'de basit bir transaction mekansızması bulmaktadır. Java'nın standart sürümü ile kullanılabilecek trasnaction sistemi sadece budur. JDBC, veritaabını ve veritabanıona bağlanan kodun transaction altyapsını kullanır. Öte yandan Java Enterprise sürümü JTA (Java Transaction API) adında daha gelişmiş özellikler içeren bir kütüphaneye sahiptir. Örneğin bir çok veritabınan okuyup yazan işlemleri destekler. Burada sadece JDBC transaction'ları anlatılacaktır. Ancak JTA'nın nasıl bir şey olduğunu okurun anlayabilmesi için basit bir örnek vermek faydalı olabilir.

UserTransaction transaction = context.getUserTransaction();
try {
	transaction.begin();
	// Cesitli Islemler
    transaction.commit();
} catch (Exception e) {
	e.printStackTrace();
	transaction.rollback();
}

JDBC Transaction'ları ve AutoCommit (Otomatik Teslim)

JDBC'de yapılan her işlem veritabanına yansıtılır. Bunu sağlayan Connection'ın AutoCommit property'sininz true olmasıdır. Transaction biçimidne çalışmak için bu property false yapılır. Daha sonra işlemler toplu halde veritabanına yansıtılacağı zaman Connection'un commit() method'u çağrılır. (Burada begin demeye gerek yok, connection'un yaratıldığı an başlangıç kabul edilir.) Herhangi bir hata olması (exception oluşması ) durumunda rollback() method'u çağrılır.

Bir banka hesabından diğerine para transferi yapapn bir örnek yapalım. Bu işlemler transaction içerisinde gerçekleşsin.

TransactionTest.javaİndir Göster Gizle Kopar Satır Gizle Satır Göster
  1 package com.godoro.samples.jdbc;
  2 import java.sql.*;
  3 public class TransactionTest {
  4     
  5   public static void main(String[] args)
  6     throws Exception
  7   {
  8     String driverClass="sun.jdbc.odbc.JdbcOdbcDriver";     
  9     Class.forName(driverClass);       
 10     String url="jdbc:odbc:mydatasource";     
 11     String username="sa";
 12     String password="godoro";
 13     Connection connection = DriverManager.getConnection(url,username,password);
 14     System.out.println("Connected to database");          
 15     
 16     try{
 17         double transferAmount=100; 
 18         int accountNumFrom=123;
 19         int accountNumTo=321;
 20         connection.setAutoCommit(false);
 21         
 22         String sqlFrom="update BankAccount"
 23                 +" set Amount=Amount-"+transferAmount
 24                 +" where AccountNumber="+accountNumFrom;
 25         Statement stmtFrom=connection.createStatement();
 26         stmtFrom.executeUpdate(sqlFrom);
 27         String sqlTo="update BankAccount"
 28                 +" set Amount=Amount+"+transferAmount
 29                 +" where AccountNumber="+accountNumTo;
 30         Statement stmtTo=connection.createStatement();
 31         int affected=stmtTo.executeUpdate(sqlTo);
 32         if(affected>0){
 33             connection.commit();        
 34             System.out.println("Money transferred");
 35         }else{
 36             connection.rollback();
 37             System.out.println("Transaction rolled back");                
 38         }   
 39     }catch(Exception e){
 40         e.printStackTrace();
 41         connection.rollback();
 42         System.out.println("Transaction rolled back");        
 43     }
 44     
 45     
 46     
 47     
 48   }
 49     
 50 }

Bu örnekte öncelikle

connection.setAutoCommit(false);

diyerek yapılan değişikliklerin veritabanına otomatik olarak yansımaması sağlanıyor. İki statement ardarda execute ediliyor. Hata olmaması durumunda

connection.commit();

olması durumunda da

connection.rollback();

yapılıyor. Örnekte iki şekilde hata kontrolü var. Birincisi executeUpdate'de etkilen satır sayısına bakılıyor. Çünkü hiç bir exception çıkmasada herhnagi biri güncelleme yapılmamış olması durumda da işlemin geri alınması gerekir. İkinci hata kontrolü ve rollback Exception çıkması durumda yapılıyor.

Aslında connection.rollback() de bir exception fırlata bilir. Doğru kod aşağıdakigibi olmalıydı.

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır