Veritabani uygulamalarinda, CRUD(Create Update Delete) işlemleri yaygın olarak kullanılır. Transaction veritabanindaki verilerin dogru ve diger verilerle tutarli olmasini saglamak icin kullanilan bir yontemdir. Kısacasi “işlem grubu” olarak tanımlanabilir. Bu işlem grubunu oluşturan işlemler veritabaninda yazma/okuma/guncelleme islemleri yapan işlemlerdir.Transaction temelde begin, commit ve rollback operasyonlarini yapar. Begin ile “birazdan veritabani islemleri yapacagim haberin olsun” diyoruz, Transaction’da “tamam o zaman yaptigin islemleri ben aklima yaziyorum, ama veritabanina hemen yansitmayacam ancak ve ancak zamani gelince yaparim o işi” der.
Transaction begin ile baslatildiktan sonra ve veritabani işlemlerini gerceklestirdikten sonra commit ile “İşlemlerimi hallettim, şimdilik bi işim kalmadi, bu aklina aldigin degisiklikleri artik veritabanina yansit” diyoruz. Transaction da “tamamdir patron” der ve veritabani kayitlari uzerinde yaptigimiz degisiklikler ancak o zaman gercekten yansir. Peki yaptigimiz veritabani islemlerinde biri hataya neden olursa ne olur? İşte o zaman transaction rollback dedigimiz “geri alma” işlemini yaparak aklina aldigi işlemleri iptal eder ve veritabanina hic bir degisiklik yansimamis olur.
Bunun onemi nedir peki? Kritik bir işlem dizisi düşünelim mesela bir banka işlemi. Bu işlem dizisinin adi P olsun ve A,B, C işlemlerinden olussun. Bir transaction baslatilip, sirasiyla A ve B işlemlerini basarili bir sekilde yaptigimizi ancak C isleminde onemli bir hata olustugunu dusunelim. Boyle bir senaryoda P islem dizisinin tümden basarisiz olmasi beklenir ve A,B işlemlerinin sonuclarinin iptal edilmesi, urettikleri degisikliklerin veritabanina yansimamasi istenir. Istedigimiz aslinda transaction’ın rollback ozelligi.
Transaction’ı basit duzeyde ifade ettikten sonra bunu hibernate ile nasil kullanilacagini soylemek de sira. Hibernate bize 3 şekil Transaction Yonetimi sunar. Bunlarin ayrintisini ve konfigurasyonun nasil yapildigini ogrenmek icin buradan okuyabilirsiniz. Ben sadece programci gozuyle bu yontemleri ne zaman ve nasil kullanmamiz gerektiginden bahsedecegim.
1. JDBC Transaction Yonetimi
JDBC Transaction Yonetimi varsayilan ele alma bicimidir. Veritabani duzeyinde ele alinir. Ancak hibernate bize JDBC API’leri ile ugrasmaktansa Session nesnesi ile sarmaladigi transaction nesnesini kullanmamiza izin verir. Bu transaction nesnesini kullanabilmek icin mutlaka bir tane Hibernate Session nesnemiz olmalidir.
try {
//Transaction, Hibernate session nesnesi araciligiyla baslatilir
factory.getCurrentSession().beginTransaction();
// İslem dizisi
factory.getCurrentSession().load(...);
factory.getCurrentSession().persist(...);
//Transaction commit edilir, degisiklikler onaylanır
factory.getCurrentSession().getTransaction().commit();
}
catch (RuntimeException e) {
//Hata durumunda rollback yapilir
factory.getCurrentSession().getTransaction().rollback();
throw e;
}
2. JTA Transaction Yonetimi
Java Transaction API, bir java standardidir. JTA ile ilgili bilmeniz gereken en onemli unsur, dagitik birden cok veritabaniyla uygulamanizin baglantisi varsa JTA kullanmanizin gerekliligidir. Programlama olarak JDBC yonteminden farki transaction nesnesinin JNDI yontemile elde edilmesi, yani bunun icin Hibernate Session nesnesine ihtiyac duymamasidir. Ancak arka planda current session ile JTA transaction’i otomatik olarak birbirine baglanmaktadir.
try {
UserTransaction tx = (UserTransaction)new InitialContext()
.lookup("java:comp/UserTransaction");
tx.begin();
factory.getCurrentSession().load(...);
factory.getCurrentSession().persist(...);
tx.commit();
}
catch (RuntimeException e) {
tx.rollback();
throw e;
}
3. CMT/EJB Transaction Yonetimi
EJB3 dependency injection ile Transaction yonetiminin kodlanmasiyla ilgilenmek istemiyor, bunun arka planda otomatik olarak yapilmasini istiyorsaniz bu yontemi kullanabilirsiniz. Boyle bir durumda asagidaki gibi bir methodun cagrilmasiyla Transaction yaratilmis, sonlanip geri donmesiyle otomatik olarak sonlandirilmistir. Hicbir sekilde Transaction nesnesine mudahale etme imkaniniz bulunmuyor. begin, commit,rollback methodlarini cagirmaniz durumunuda IllegalStateException alirsiniz
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void doSomeWork() {
// Do some work
factory.getCurrentSession().load(...);
factory.getCurrentSession().persist(...);
}