Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Yaşar Gözüdeli
Yaşar Gözüdeli
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
10 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: bakiye=bakiye basarili commit havale ifadesi islemler islemlerin kullanici return rollback server sonra tblhesap transaction yolunda ADO.NET/SQL Yaşar Gözüdeli
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : ADO.NET/SQL
Yayınlanma Tarihi : 1.10.2004
Okunma Sayısı : 89959
Yorum Sayısı : 1     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 4.12.2024
Turhal Temizer
Mac OS/X Removing CUDA 4.12.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak 4.12.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 4.12.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Transaction Kavramı
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
Transaction, özet olarak daha küçük parçalara ayrılamayan işlem demektir. Özellike bir grup işlemin arka arkaya gerçekleşiyor olmasına rağmen, seri işlemler halinde ele alınması gerktiğinde kullanılır. Transaction bloğu içerisindeki işlemlerin tamamı gerçekleşinceye kadar hepsi gerçekleşmemiş varsayılır.

Bir banka uygulamasını düşünün. Bir kullanıcı başka bir kullanıcıya havale yaptığında ne olacağına bakalım. Öncelikle havale yapanın hesap bilgilerinden havale yaptığı miktar düşülür. Ardından alıcının hesabına bu miktar eklenir ve havale gerçekleşmiş olur. Ancak her zaman şartlar istendiği gibi olmayabilir. Örneğin, gönderenin hesabından para düşüldüğü anda elektrik kesilebilir ya da program takılabilir. Bu durumda, ne olur? Örneğin, gönderenin hesabından para düşülmüştür ama alıcının hesabına da geçmemiştir yani bir kısım paranın sahibinin kimliği kaybedilmiş olur. Bu da sistemin olası durumlar dışında veri kaybetmeye müsait bir hal alması demektir. Bu durumun bir şekilde önlenmesi gerekir.

Daha küçük parçalara ayrılamayan en küçük işlem yığınına Transaction denir. Geçerli kabul edilmesi bir dize işlemlerin tamamının yolunda gitmesine bağlı durumlarda transaction kullanılı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.

SQL Server 3 farklı transaction desteği sağlar:

1. Harici(Explicit) Transaction: SQL Server’in kullanıcı tarafından bir BEGIN TRAN ifadesi ile transaction’a başlatılması şeklindeki bloktur. Bir aksilik olması halinde SQL Server tarafından veya kullanıcı tarafından COMMIT ifadesi ile gerçekleşmiş olarak veya ROLLBACK ifadesi ile hiç olmamış olarak sonlandırlabilir.

2.Dahili(Implict) Transaction: SQL Server’in belli ifadelerden sonra otomatik olarak transaction açmasını sağlar. Bu modda, bu belli ifadeler kullanıldıktan sonra, kullanıcı tarafından transaction’ın sonlandırılması gerekir. Bu nedenle zahmetli bir mod’dur.

3.Auto Commit: Hiç bir transaction mod’u tayin edilmedi ise, SQL Server bu modda çalışır. Auto Commit modunda iken, her bir batch(yığın, Query Analyzer için iki go arasındaki ifade veya bir defada çalıştırılan bütün SQL ifadeleri) bir transaction bloğu olarak ele alınır. Batch içerisinde bir sorun olursa, SQL Server otomatik olarak bütün batch’i  geri alır(ROLLBACK eder).

Ancak biz genel olarak transaction denilince, harici transaction işlemlerini kastederiz. Harici transaction bloğunun başlatılması ve gelişimini ele alacak olursak:

1.Transaction bloğu başlatılır. Böylece yapılan işlemlerin geçersiz sayılabileceği VTYS’ye deklare edilmiş olur ve SQL Server Auto Commit modundan çıkıp, Explicit moda geçer.

2.Transaction bloğu arasında yapılan her bir işlem bittiği anda başarılı olup olmadığına gerek varsa, programcı tarafından bakılıp, başarılı olmadığı anda geri alım işlemine geçilebilir(ROLLBACK).  Ancak bir sorun olması halinde, SQL Server tarafından da verilerin tutarlılığını denetlemek üzere, transaction bloğunun başladığı andan itibaren bir güç kesilmesi gibi durum ortaya çıkarsa, değişiklikler dikkate alınmayacak şekildedir. Bu, transaction logları denilen yöntem ile yapılır. Bu yöntemde, bir transaction başladıktan sonra, verileri tutan sayfalar diskten(HDD) hafızaya(RAM) yüklenir ve ilgili değişiklikler, önce hafızada yapılır. Ardından, değişikliklerin izdüşümü loglar diske yazdırılır, ardından veriler de güncellenir.

3.Tüm işlemler tamamlandığı anda COMMIT ile bilgiler yeni hali ile sabitlenir. Başarısız bir sonuç ise ROLLBACK ile en başa alınır ve bilgiler ilk hali ile sabitlenir.

Bu örnek için aşağıdaki tabloyu kullanacağız: Hesap tablosu

CREATE TABLE(

 HesapNo CHAR(20) NOT NULL PRIMARY KEY,

 Adi VARCHAR(55),

 Soyadi VARCHAR(55),

 Sube INTEGER,

 Bakiye FLOAT

)

Genel Yapısı şu şekildedir:

1.Transaction başlatılır:

BEGIN TRAN[SACTION] [transaction_adi]
İle bir transaction başlatılır.

Örnek:

DECLARE @havaleMiktar FLOAT DECLARE @aliciHesap VARCHAR(20), @gonderenHesap VARCHAR(20)

SET @aliciHesap=’1111122132113’

SET @gonderenHesap=’1111122132112’

SET @havaleMiktar=20000000

-- 20 milyon havale edilecek

BEGIN TRANSACTION

UPDATE tblHesap

SET bakiye=bakiye - 20000000

WHERE hesapNo=@gonderenHesap

UPDATE tblHesap

SET bakiye=bakiye + 20000000

WHERE hesapNo=@aliciHesap

2.İşlem başarılı olursa, COMMIT ile transaction bitirilir. Başarısız olduğunun anlaşılması haline ROLLBACK komutu ile transaction başarısız olarak bitirilebilir.(Yani en baştaki duruma geri dönülür)

COMMIT
Sabitleme noktaları:

Bazen, bir noktaya kadar gelindikten sonra, işlemlerin buraya kadar olanını geçerli kabul etmek isteriz ama, bundan sonraki işlemler için de transaction(geri alabilme seçeneği)ne ihtiyaç duyarız. Bu türden durumlarda sabitleme noktalarından faydalanılır.

Bir sabitleme noktası başlatıldığı anda, en başa dönme seçeneği saklı kalmak üzere, noktanın oluşturulduğu yere de dönme seçeneği sunar

Genel yapısı şu şekildedir:

SAVE TRANSACTION sabitleme_notkasi_adi
Örnek:

BEGIN TRANSACTION UPDATE tblHesap

SET bakiye = 5000000

WHERE hesapNo=’1’

SAVE TRANSACTION svp_kaydet

DELETE FROM tblHesap

WHERE  HesapNo=’1’;

ROLLBACK TRAN svp_kaydet;

SELECT * FROM tblHesap;

ROLLBACK TRAN ;

SELECT * FROM tblHesap;

COMMIT

İPUCU:

Bir uygulamanın parçası olarak görev yapan transaction’lar, gerçek uygulamalarda genellikle stored procedure’ler içerisinde başlatılırlar.  Bu durumda, bir hesaptan başka bir hesaba havale işlemini gerçekleştirecek bir stored procedure , dışarıdan, üç parametre alır: havale eden hesap numarası, havaleyi alacak hesap numarası ve havale miktarı. RETURN parametresi ile de işlem başarılı ise 1, değil ise 0 döndürülebilir.

CREATE PROC SP$havale(@aliciHesap CHAR(10),@gonderenHesap CHAR(10),@miktar MONEY) AS

    BEGIN TRANSACTION

       UPDATE tblHesap

       SET bakiye=bakiye - 20000000

       WHERE hesapNo=@gonderenHesap

       IF @@ERROR<>0

          ROLLBACK

          RETURN 0

       UPDATE tblHesap

       SET bakiye=bakiye + 20000000

       WHERE hesapNo=@aliciHesap

       IF @@ERROR<>0

          ROLLBACK

          RETURN 0

    COMMIT

    RETURN 1

GO

Test etmek için,

DECLARE @sonuc TINYINT
EXEC @sonuc =  SP$havale(’1111122132113’, ’1111122132112’  ,20000000)
Makale:
Transaction Kavramı ADO.NET ve SQL Yaşar Gözüdeli
  • Yazılan Yorumlar
  • Yorum Yaz
MAY
15
2012
Benim sormak istediğim eğer benim insert update ve deletlerim birden fazla ise ve bunlar birbirine bağımlı olarak gidecekse ve arada da selectler olacak sa ben en son adımda commmit yapmak istediğimde nasıl bir yol izleyeceğim ?? Yalnız araya Select sözcükleri ile veritabanından kayıt da çekmekteyim böyle bir sistem için nasıl bir yol izlenebilir ?. Teşekkür ederim
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor