joomla templates Data Warehouse Türkiye

Thu09082011

Last update07:32:32 PM GMT

Back Kategoriler Java Hibernate Hibernate ve Transaction Yönetimi
Çarşamba, 27 Ekim 2010 12:56

Hibernate ve Transaction Yönetimi

Yazan&Gönderen  Yusuf Arslan
Bu Öğeyi Derecelendir
(0 Oylar)

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(...);
}

 

kaynak

 

Son Düzenleme Çarşamba, 16 Şubat 2011 22:51
Yusuf Arslan

Yusuf Arslan

Oracle Open Source

Tokat/Reşadiye doğumluyum.İlk-orta-lise hayatını Amasya/Suluova ilçesinde geçirdim.Sakarya Üniversitesi Bilgisayar Mühendisliği bölümünü bitirdikten sonra kariyerime Turkcell  İş Zekası Test Uzmanı olarak devam etmekteyim. 

Website: arslanyusuf.blogspot.com/ E-posta: Bu e-Posta adresi istek dışı postalardan korunmaktadır, görüntülüyebilmek için JavaScript etkinleştirilmelidir

Login to post comments