folder Tahribat.com Forumları
linefolder C#.Net, J#.Net, Vb.Net, Asp.Net
linefolder MVC5 Identity'nin Transactionscope İçinde Timeout Exception Vermesi



MVC5 Identity'nin Transactionscope İçinde Timeout Exception Vermesi

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MadJack
    MadJack's avatar
    Kayıt Tarihi: 07/Temmuz/2014
    Erkek

    Kullanıcı-üyelik işlemleri için Identity, diğer işlemler için de normal ADO.Net kullandığımız bir uygulama var. Standart database işlemlerinde eğer birden fazla insert/update sorgusu atacaksak TransactionScope kullanıyoruz. Normalde scpoe içine istediğim kadar query ekleyebiliyorum. Hatta gerekirse kendim timeout bile veriyorum. Fakat bu lanet şeyin içine Identity'e ait bi create yada update işlemi koyunca o işlemde 'Timeout expired' diye hata fırlatıyor. Scope'a 30 dk.'lık timeout koysam bile 10-20 saniye içinde exception veriyor. Scope içinde Identity'nin find gibi methodlarında sorun olmuyo, sadece tabloyu değiştiren methodlar problem çıkarıyo.

    Basitçe, scope kullanmayarak olası exceptionları yakalayıp önceki database işlemlerini geri alabilirim, kullanıcı ekleyip güncellerken entity framework kullanmayıp kendim insert edebilirim gibi amelece çözümler düşünüyorum ama şu aşamada çok büyük zaman kaybı olur.

    Örnek kodlar aşağıda, yardımcı olacaklara teşekkür ediyorum.

    public void CreateUser(string password){
        var userManager = new MyUserManager(new UserStore<ApplicationUser>(new ApplicationDbContext()));
    
        using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(0,30,0)))
        {
            var company = new Company(){
                Id = Guid.NewGuid(),
                Name = "Cmp1"
            };
    
            AddCompany(company);
    
            var user = new ApplicationUser()
            {
                UserName = "Usr1"
                CompanyId = company.Id
                //... Diğer özellikler ...
            };
    
            userManager.Create(user, password);  // Exception burada çıkıyor.
            scope.Complete();
        }
    }
    
    
    public void AddCompany(Company company)
    {
        using (SqlConnection connection = new SqlConnection(CONN))
        {
            SqlCommand command = new SqlCommand();
    
            command.Connection = connection;
            command.CommandText = "INSERT INTO Companies values( @Id, @Name)";
    
            command.Parameters.AddWithValue("@Name", company.Name);
            command.Parameters.AddWithValue("@Id", company.Id);
    
            connection.Open();
            command.ExecuteNonQuery();
            connection.Close();
        }
    }

     


    Everyone sees just what they want to see.
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Elif Esra
    rakkoc
    rakkoc's avatar
    Kayıt Tarihi: 19/Aralık/2003
    Homo

    transactionscope icinde insert edilmis bir kaydi (ROW) comit etmeden tekrar update etmek istersen veya ayni tabloyu iki defa update etmen genele bu hatayi verir.

    Ayni sekilde insert veya update ettigin datayi comit etmeden once select de etsen timeout verir. ayni anda 2 transaction da olusmus olabilir mi hocam ? farkli sayfalarda o tabloya transaction baslatmis olabilir.


    Bu aralar fazla yogunum. Unuttugum seyler oluyorsa affola. || Kişisel : Http://blog.rakkoc.com // Kurumsal : http://www.Yoroca.com
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MadJack
    MadJack's avatar
    Kayıt Tarihi: 07/Temmuz/2014
    Erkek

    Demek istediğini anladığımı teyit etmek için örnek kod üzerinden gideyim; şirket ekliyorum, onu commitlemeden şirket id'si ile ilişkisi olan kullanıcılar tablosuna başka bir kayıt ekliyorum. Commitlenmediği için olmayan bir kaydın id'si ile ilişki kuramıyor. Eğer hatanın sebebi bu ise, Entity Framework yerine kendim kaydı insert ettiğimde sorun olmuyor.

    userManager'ı şirket ekleme işleminden sonra oluştursam da birşey değişmeyecek, çünkü veri database'e eklenmediğinden aynı problem devam edecek diye düşünüyordum, denedim yine exception'a düştü.

    aynı anda iki transactiona düşme ihtimali yok galiba. transactionScope ve Identity kullandığım her yerde istisnasız her seferinde veriyo çünkü, ayrıca bu method tek bi controllerdan çağrılıyo ve o controllera tek bir sorgu gidiyo.


    Everyone sees just what they want to see.
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MadJack
    MadJack's avatar
    Kayıt Tarihi: 07/Temmuz/2014
    Erkek

    Yardımcı olabilecek varsa diye up olsun


    Everyone sees just what they want to see.
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    hiç TransactionScope kullanmadım, ama db context e timeout verip dener misin hocam

  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MadJack
    MadJack's avatar
    Kayıt Tarihi: 07/Temmuz/2014
    Erkek
    unbalanced bunu yazdı

    hiç TransactionScope kullanmadım, ama db context e timeout verip dener misin hocam

    timeout süresi kısa olan dolduğunda exception fırlatıyor hocam, bişey değişmiyor yani.

    TransactionScope; Complete methodu çağrılmadıkça verileri veritabanına yazmıyor. Context'de aynı bağlantı üzerinden aynı veritabanını kullanmaya çalıştığı için deadlock oluşuyor. Birkaç kişiye daha sormuştum soruyu, aldığım cevaplardan anladığım kadarıyla sebebi bu. Gerçi pek tatmin etmedi beni, sonuçta veritabanına bir bağlantı açıksa ikinci bağlantının açılmasına izin vermemesi gerekiyor diye biliyorum. Burada her iki bağlantı da açılıyor. Ya da EF benim anladığımdan çok daha farklı şekilde çalışıyor. Bunun üzerine uğraşırsam birşeyler çıkar belki.

    Teşekkürler yorumlarınız için.


    Everyone sees just what they want to see.
Toplam Hit: 764 Toplam Mesaj: 6