Şimdi Ara

EF otomatik Transaction (Soru)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
5
Cevap
0
Favori
212
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • 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.



  • 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.
  • 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.




  • 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.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.