" Umut, hiç görmeyen birine gökkuşağını anlatmak kadar zor ve imkansız... "

Categories

-

Vb.Net DbTransaction Nesnesi

DbTransaction nesnesi veritabani sistemine gönderdigimiz sorguya ait islem-bilgi(Transaction) yönetimini saglamak için kullanilir. Bilindigi gibi transaction (islem-bilgi) kavrami, veritabani yönetim sistemlerinde önemli bir yere sahip olup birbirleriyle iliskili is parçaciklarinin bulundugu mantiksal bir birim olarak düsünülebilir. Islem yönetimi, ayni is parçaciginda seri bir sekilde yürütülecek sorgularin hatasiz bir sekilde sonuçlanip, sonuçlanmadiginin kontrolunu saglar. Klasik bir örnek olarak banka sisteminde havale uygulamasini ele aldigimizda ilk önce havaleyi yapan kisinin hesabindan ilgili miktar düsürülür ve havale yapilan kisinin hesabina o kadar miktar eklenir. Disaridan basit gibi görünen bu sürecin herhangi bir halkasinda meydana gelecek bir hata kaynak ve hedef sistemde bilgi tutarsizligina neden olacaktir. Bu yüzden islemlerin islem-bilgi yönetiminde gerçeklesmesi gerekir. “Ya hep Ya hiç” mantigiyla çalisan islem-bilginin esas amaci “veri bütünlügü” olup süreç içerisinde istenmeyen bir durum oldugu zaman önceki is parçacilarinin geri alinamasidir. Yani süreç baslangiç noktasina geri döndürülür ve süreç içindeki hiçbir is parçaciginin gerçeklesmemis oldugu kabul edilir. Örnegin SQL sunucusunda çalistirdigimiz bir UPDATE ve DELETE islemi esnasinda bir kesinti oldugu zaman o zaman kadar gerçeklestirilmis güncelleme veya silme islemleri geri alinir ve veriler eski haline geri dönmüs olur. Bu geri alma islemine ROLLBACK (geri sarmak) islemler hatasiz çalistigi durumda degisikliklerin kalici hale getirilmesine COMMIT (islemek/onaylamak) denilir.

ADO.NET’te islem-bilgi yönetimini saglayan temel sinif system.data.common.dbtransaction sinifidir. ADO.NET 2.0 ile birlikte transaction yönetimi saglayicilardan bagimsiz da yapilabilir hale getirildi ve bu amaçla System.Transaction.dll kütüphanesi gelistirildi. Öncelikle saglayicilara bagimli yapi üzerinde çalisacagiz. Dbtransaction sinifinin üyelerini listeleyelim.

Connection : Transaciton nesnesinin iliskili oldugu Connection nesnesini belirler.

Commit() : Transaction sürecinin basarili olmasi durumunda verileri, veritabani üzerinde kalici kilar.

IsolationLevel : Islem-bilgilerin birbirleriyle olan yalitim seviyesini belirtir.

RollBack() : Hatali is parçacigina kadar yapilmis islemleri geri sarip, süreci islemimis kilar.

Sorgularimizi islem yönetiminde gerçeklestirmek için öncelikle Connection ve Command nesnei tanimlanir. Veri kaynagiyle baglanti kurmak amaciyla Connection nesnesinin Open() yordami çagirilir. Ardindan Connection nesnesinin Begin-Transaction() yordami kullanilarak bir Transaction nesnesi olusturulur. Bu nesne Command nesnesiyle iliskilendirilir. Sorgumuzun basarili olup olmadigini yakalamak için try-catch blogu kullanilir. Eger sorgu basarili olursa yani try blogu tümüyle islendigi zaman Transaction nesnesi Commit() edilir. Sorgunun basarisiz olmasi durumunda, yani program catch bloguna girerse Transaction nesnesi Rollback() edilir.

Asagidaki kodlarda basit bir islem-bilgi yönetimini bulabilirsiniz.

Imports System.Data
Imports System.Data.OleDb
Public Class Form1

    Dim baglanti_metni As String
    Dim baglanti As New OleDbConnection
    Dim sorgu As New OleDbCommand
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBox1.Focus()
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        baglanti_metni = "Provider=Microsoft.Jet.Oledb.4.0; Data Source=|DataDirectory|\Database1.mdb; Persist Security info=False;"
        baglanti = New OleDbConnection(baglanti_metni)
        sorgu = New OleDbCommand("Update musteri Set adsoyad=@name Where id=1", baglanti)
        sorgu.Parameters.AddWithValue("@name", TextBox1.Text)
        baglanti.Open()

        ' Transaction nesnesi olusturalim.
        Dim oTrs As OleDbTransaction = baglanti.BeginTransaction()

        ' Transaction nesnesini Command nesnesiyle iliskilendirelim.
        sorgu.Transaction = oTrs

        Try
            sorgu.ExecuteNonQuery()
            ' Sorgu basariyla yürütüldügü için islemi kalici yapalim.
            oTrs.Commit()
            TextBox2.Text = "Islem Basarili !"
        Catch ex As Exception
            ' Sorgu basarisiz oldugu için islemi geri alalim.
            oTrs.Rollback()
            TextBox2.Text = "Islem Basarisiz !"
        Finally
            sorgu.Dispose()
            baglanti.Dispose()
        End Try
    End Sub
End Class

Gerçekten transaction yönetimini kullanip kullanmadigini sinamak için sorgu yürütüldükten sonra sistemi hata verdirelim !

Imports System.Data
Imports System.Data.OleDb
Public Class Form1

    Dim baglanti_metni As String
    Dim baglanti As New OleDbConnection
    Dim sorgu As New OleDbCommand
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBox1.Focus()
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        baglanti_metni = "Provider=Microsoft.Jet.Oledb.4.0; Data Source=|DataDirectory|\Database1.mdb; Persist Security info=False;"
        baglanti = New OleDbConnection(baglanti_metni)
        sorgu = New OleDbCommand("Update musteri Set adsoyad=@name Where id=1", baglanti)
        sorgu.Parameters.AddWithValue("@name", TextBox1.Text)
        baglanti.Open()

        ' Transaction nesnesi olusturalim.
        Dim oTrs As OleDbTransaction = baglanti.BeginTransaction()

        ' Transaction nesnesini Command nesnesiyle iliskilendirelim.
        sorgu.Transaction = oTrs

        Try
            sorgu.ExecuteNonQuery()

            ' Burada sistem hata versin.
            Throw New Exception("Hata Olustu !")

            ' Sorgu basariyla yürütüldügü için islemi kalici yapalim.
            oTrs.Commit()
            TextBox2.Text = "Islem Basarili !"
        Catch ex As Exception
            ' Sorgu basarisiz oldugu için islemi geri alalim.
            oTrs.Rollback()
            TextBox2.Text = "Islem Basarisiz !"
        Finally
            sorgu.Dispose()
            baglanti.Dispose()
        End Try
    End Sub
End Class

Örnegimizi biraz daha genisletip ayni transaction bünyesinde çalisacak iki Command nesnesi kullanalim. Ilk Command nesnesi müsteri tablosundaki 1 numarali, ikinci command nesnesi makale tablosundaki 1 numarali makalenin kaydini güncelleyecek.

Imports System.Data
Imports System.Data.OleDb
Public Class Form1

    Dim baglanti_metni As String
    Dim baglanti As New OleDbConnection
    Dim sorgu1 As New OleDbCommand
    Dim sorgu2 As New OleDbCommand
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBox1.Focus()
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        baglanti_metni = "Provider=Microsoft.Jet.Oledb.4.0; Data Source=|DataDirectory|\Database1.mdb; Persist Security info=False;"
        baglanti = New OleDbConnection(baglanti_metni)
        sorgu1 = New OleDbCommand("Update musteri Set adsoyad=@name Where id=1", baglanti)
        sorgu1.Parameters.AddWithValue("@name", TextBox1.Text)
        sorgu2 = New OleDbCommand("Update makale Set yazimiz=@name Where id=1", baglanti)
        sorgu2.Parameters.AddWithValue("@name", TextBox3.Text)
        baglanti.Open()

        ' Transaction nesnesi olusturalim.
        Dim oTrs As OleDbTransaction = baglanti.BeginTransaction()

        ' Her iki command nesnesini oTrs ile iliskilendirelim.
        sorgu1.Transaction = oTrs
        sorgu2.Transaction = oTrs

        Try
            sorgu1.ExecuteNonQuery()
            sorgu2.ExecuteNonQuery()
            ' Sorgu basariyla yürütüldügü için islemi kalici yapalim.
            oTrs.Commit()
            TextBox2.Text = "Islem Basarili !"
        Catch ex As Exception
            ' Sorgu basarisiz oldugu için islemi geri alalim.
            oTrs.Rollback()
            TextBox2.Text = "Islem Basarisiz !"
        Finally
            sorgu1.Dispose()
            baglanti.Dispose()
        End Try
    End Sub
End Class

Bu iki sorgu bu haliyle sorunsuz çalisacaktir. Islem-bilgi yönetiminin etkisini görmek için ikinci sorgumuzda bilinçli bir hata yapalim. Makale tablosunda olmayan bir kolonu güncellemeye çalisalim.

sorgu1 = New OleDbCommand("Update musteri Set adsoyad=@name Where id=1", baglanti)
sorgu1.Parameters.AddWithValue("@name", TextBox1.Text)
sorgu2 = New OleDbCommand("Update makale Set OlmayanKolon=@name Where id=1", baglanti)
sorgu2.Parameters.AddWithValue("@name", TextBox3.Text)

Bu iki sorgu ayni islem-bilgi bünyesinde çalistigi için ikinci sorgunun basarisiz olmasindan dolayi ilk sorgu geri alinir.

Uygulama dosyalarini buradan indirebilirsiniz.

  • 0
  • 1955
  • 0

- BUNLARIDA GÖZDEN GEÇİREBİLİRSİNİZ -

HENÜZ YORUM YAPILMAMIŞ !

Yorum yazın

HAKKIMDA

KONULARI TAKİP EDİN

SOSYAL AĞLAR

  • Mesajınızı Gonderin