Arama butonu
Bu konudaki kullanıcılar: 1 misafir, 1 mobil kullanıcı
3
Cevap
261
Tıklama
0
Öne Çıkarma
EF otomatik Transaction (Soru)
N
6 yıl
Er
Konu Sahibi

Arkadaşlar aşağıdaki şekilde bir store procedur var.

CREATE PROCEDURE [dbo].[XXX_Deneme_Insert]
AS
BEGIN
INSERT INTO DENEME_TABLO (X) VALUES (5)
INSERT INTO DENEME_TABLO (X) VALUES (1/0)
END

Bu proceduru SQL Management içerisinden execute ettiğimde normal olarak ilk satırda bulunan komut çalışıyor ve (Deneme_Tablo) ya bir kayıt ekleniyor ancak ikinci satırda sıfıra bölünme hatası oluştuğu için işlem duruyor.Sonuçta hata oluşsa bile tabloya bir kayıt eklenmiş oluyor.

Benim sorum bu proceduru EF içerisinden çağırdığımda hatayı yine veriyor ancak tabloya baktığımda kayıt oluşmadığını görüyorum.Acaba EF kendi içerisinde otomatik bir transaction mu çalıştırıyor merak ediyorum bilen cevaplarsa sevinirim.



Y
6 yıl
Yüzbaşı

Emin değilim ama muhtemelen EF'de bir ROLLBACK fonksiyonu var hata oluştuğunda.

db.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, sql, parameters);

Versiyon EF6 ise bu fonksiyon kullanılması önerilmiş. SQL Management'taki şekilde çalışabilir bu durumda.


Bu mesaja 1 cevap geldi.
N
6 yıl
Er
Konu Sahibi

quote:

Orijinalden alıntı: yesil1026

Emin değilim ama muhtemelen EF'de bir ROLLBACK fonksiyonu var hata oluştuğunda.

db.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, sql, parameters);

Versiyon EF6 ise bu fonksiyon kullanılması önerilmiş. SQL Management'taki şekilde çalışabilir bu durumda.
Cevap için teşekkürler araştırmalarımda cevabımı buldum merak edenler için anlatayım şöyle ki;
EF sistemi biz herhangi bir sorgu çalıştırdığımızda otomatik olarak zaten bir transaction başlatmakta.Yani EF kullanıyorsanız ve "TEK PARÇA" halinde işlem yapacaksanız yani tek bir EF sorgusu çalıştıracaksanız procedure içinde veya program içinde extradan elle bir transaction açmanıza fazladan gereksiz kod yazmanıza gerek yok.

Yalnız birbiri ile bağlantılı 2 EF sorguyu çalıştırırsanız her bir sorgu için ayrı ayrı transaction açılacağı için istenmeyen bir sonuç oluşacaktır.Çünkü 2 farklı sorgu biribiri ile bağlantılı ise aynı transaction bloğu içinde yer almalı.

Bunu engellemek için yapacağınız şey tüm multiple sorgu işlemlerini bir procedure içine yazıp tekbir EF sorgusu ile çalıştırmaktır.Procedure içine yazacağınız herşey bir hata olması durumunda iptal olacaktır yani kayıt edilmeyecektir.Bu şekilde kullanırsanız programınızın veya procedurlerinizin hiç bir yerinde transaction kullanmanız gerekmiyor.Bu büyük bir kolaylık.

Eğer bu şekilde kullanmak istemiyorsanız o zaman program içinden manuel bir transaction açmalı ve yapacağımız birbiri ile bağlatılı multiple EF sorgularını bu blok içine yazmalısınız. EF sistemi bu duruma uyumlu olduğu için kendisi extradan bir transaction açmayacak ve tek bir transaction bloğu içinde işlemler sona erecektir.



M
6 yıl
Yarbay

save changes diyene kadar yaptıkğın işlemler sunucuya gönderilmez. Yani burada bir tür transcation var. Ek olrak db.Database.Begintranscation() diyerek kendin de transaction olusturabilirsin.



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.