Transaction (process ID 67) was deadlocked
Transaction (process ID 67) was deadlocked
Merhaba
Delphi ile Msssql Server 2000 de kayıt yaparken bazen
Transaction (process ID 67) was deadlocked şeklinde bir hata çıkıyor.
Sistemde 12 kullanıcı var ve bu mesaj tüm kullanıcıların ekranına aynı anda çıkıyor.
Bir fikri olan var mı?
Delphi ile Msssql Server 2000 de kayıt yaparken bazen
Transaction (process ID 67) was deadlocked şeklinde bir hata çıkıyor.
Sistemde 12 kullanıcı var ve bu mesaj tüm kullanıcıların ekranına aynı anda çıkıyor.
Bir fikri olan var mı?
Yazdığın tüm FROM lu cümleleri
şeklinde kullanın.
Kod: Tümünü seç
..FROM TABLE_NAME WITH(NOLOCK)
Selamlar,
Naile bilgiyi eksik vermiş, ben tamamlayım. FROM WITH (NOLOCK) ibaresini SELECT'lerde kullan. Bu ne demek oluyor ondan bahsedelim.
M$ Tospağası kayıt LOCK ları konusunda hala geçerli ve etkin bir çözüm geliştiremediği için INSERT veya UPDATE eden kullanıcılar o anda ilgili tabloyu veya Index Page'ini kilitlemektedirler. Bu durumda eğer kullanıcı bir de Transaction başlatmış ise, diğer Okuyucu kullanıcılar o Transaction'ın bitmesini beklerler. Bazen her iki kullanıcı birbirlerinin tablosuna yazmaya kalkar ve her ikisi de diğierinin işinin bitmesini bekler. Bu gibi durumlarda M$ SQL Server deadlock'lara düşer. Bu case'in dışında da tuhaf case'lerde aynı durum söz konusu olabilmektedir.
Bu durumların önüne geçmek için WITH (NOLOCK) yamasını geliştirdi M$. Sorunun kendisini çözemediği için her zaman uyguladığı taktik olan YAMA çözümlerinden birini ve sadece M$'a has bir söz olan WITH (NOLOCK)'ı uydurdu.
Benim tavsiyem, işi fazla derine götürmeden Firebird'e geçin bu tür dertleriniz olmasın
Kolay Gelsin
Naile bilgiyi eksik vermiş, ben tamamlayım. FROM WITH (NOLOCK) ibaresini SELECT'lerde kullan. Bu ne demek oluyor ondan bahsedelim.
M$ Tospağası kayıt LOCK ları konusunda hala geçerli ve etkin bir çözüm geliştiremediği için INSERT veya UPDATE eden kullanıcılar o anda ilgili tabloyu veya Index Page'ini kilitlemektedirler. Bu durumda eğer kullanıcı bir de Transaction başlatmış ise, diğer Okuyucu kullanıcılar o Transaction'ın bitmesini beklerler. Bazen her iki kullanıcı birbirlerinin tablosuna yazmaya kalkar ve her ikisi de diğierinin işinin bitmesini bekler. Bu gibi durumlarda M$ SQL Server deadlock'lara düşer. Bu case'in dışında da tuhaf case'lerde aynı durum söz konusu olabilmektedir.
Bu durumların önüne geçmek için WITH (NOLOCK) yamasını geliştirdi M$. Sorunun kendisini çözemediği için her zaman uyguladığı taktik olan YAMA çözümlerinden birini ve sadece M$'a has bir söz olan WITH (NOLOCK)'ı uydurdu.
Benim tavsiyem, işi fazla derine götürmeden Firebird'e geçin bu tür dertleriniz olmasın

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
ya üstadlar arkadaş veri tabanını değiştirmek istemiyor en az azındanda şimdi değiştiremez...lütfen..ama arkadaşım emin ol bunun cevabı vardır...
arama yapmak lazım....
http://sean.typepad.com/ditto/2004/12/h ... and_s.html
http://search.msdn.microsoft.com/search ... =msdn&st=b
bir de bunları incele istersen...
arama yapmak lazım....
http://sean.typepad.com/ditto/2004/12/h ... and_s.html
http://search.msdn.microsoft.com/search ... =msdn&st=b
bir de bunları incele istersen...
Siz hayal edin...Biz yapalım TuannaSoft...
Selamlar,
Biz yine de doğru yolu gösteriyoruz, ısrarcı bir biçimde devam etmesi kendi bileceği bir iştir.
Evet gelelim soruna. WITH (NOLOCK) işi çözmüyor ise muhtemelen başka bir problem vardır. Bu LOCK Olan process ID hep aynı bir kullanıcı üzerinde mi oluşuyor yoksa çeşitli çeşitli kullanıcılar üzerinde oluşabiliyor mu?
Bunların dışında, DEAD LOCK'lar aynı anda 1 tane mi o luşuyor yoksa sistemde 1'den fazla DEAD LOCK oluşuyor mu?
M$-SQL Server'ın versionu kaç? Service Pack Yüklü mü? İşletim Sistemi nedir? Makina nedir?
Bu bilgileri verir misiniz?
KOlay Gelsin
Biz yine de doğru yolu gösteriyoruz, ısrarcı bir biçimde devam etmesi kendi bileceği bir iştir.
Evet gelelim soruna. WITH (NOLOCK) işi çözmüyor ise muhtemelen başka bir problem vardır. Bu LOCK Olan process ID hep aynı bir kullanıcı üzerinde mi oluşuyor yoksa çeşitli çeşitli kullanıcılar üzerinde oluşabiliyor mu?
Bunların dışında, DEAD LOCK'lar aynı anda 1 tane mi o luşuyor yoksa sistemde 1'den fazla DEAD LOCK oluşuyor mu?
M$-SQL Server'ın versionu kaç? Service Pack Yüklü mü? İşletim Sistemi nedir? Makina nedir?
Bu bilgileri verir misiniz?
KOlay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Selamlar,
Bir dikkat edilmesi gereken nokta daha, sadece SP'leri değil programda kullandığınız bütün SELECT cümlelerinde WITH (NOLOCK) uygulamanız gerekmekte.
Kolay Gelsin
Bir dikkat edilmesi gereken nokta daha, sadece SP'leri değil programda kullandığınız bütün SELECT cümlelerinde WITH (NOLOCK) uygulamanız gerekmekte.
Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Bu veritabanından daha ziyade yazdığın kodlardan kaynaklanıyor gibi.
SELECT statementl'ara WITH (NOLOCK) yazmana gerek yok.
Transaction uyguladığın kodları (StartTransaction, Commit, RollBack...) ve kullandığın veritabanı komponentlerini ve grubunu (dbExpress, TSQLQuery...) belirtirsen belki daha yardımcı olabiliriz.
SELECT statementl'ara WITH (NOLOCK) yazmana gerek yok.
Transaction uyguladığın kodları (StartTransaction, Commit, RollBack...) ve kullandığın veritabanı komponentlerini ve grubunu (dbExpress, TSQLQuery...) belirtirsen belki daha yardımcı olabiliriz.
Selamlar,
Merak ettim acaba bir geliştirme yapmış olabilir mi diye ama neden WITH (NOLOCK) Yazılmasına gerek yok dedin?
Eğer M$-SQL Server bir yazma işlemi yapıyorsa, diğer kullanıcıların Dirty Read yapabilmesi için yada Yazan kişiyi beklememesi için WITH (NOLOCK) Kullanması gerekir. Eğer kullanmaz ise, okuyan kullanıcı yazan kullanıcıyı bekler. Ayrıca Normal bir INSERT veya UPDATE yaparken kullanıcı kendisi TRANSACTION başlatmamış bile olsa, M$ illa ki Implicit Transaction'ı kendi başlatır. Uygulanan her SQL cümlesi için bunu M$-SQL Server otomatik olarak yapar, siz SELECT yazmış olsanız dahi.
Acaba M$ bu konuda bir değişiklik veya geliştirme mi yaptı M$-SQL Server'da?
Kolay Gelsin
Merak ettim acaba bir geliştirme yapmış olabilir mi diye ama neden WITH (NOLOCK) Yazılmasına gerek yok dedin?
Eğer M$-SQL Server bir yazma işlemi yapıyorsa, diğer kullanıcıların Dirty Read yapabilmesi için yada Yazan kişiyi beklememesi için WITH (NOLOCK) Kullanması gerekir. Eğer kullanmaz ise, okuyan kullanıcı yazan kullanıcıyı bekler. Ayrıca Normal bir INSERT veya UPDATE yaparken kullanıcı kendisi TRANSACTION başlatmamış bile olsa, M$ illa ki Implicit Transaction'ı kendi başlatır. Uygulanan her SQL cümlesi için bunu M$-SQL Server otomatik olarak yapar, siz SELECT yazmış olsanız dahi.
Acaba M$ bu konuda bir değişiklik veya geliştirme mi yaptı M$-SQL Server'da?
Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/