deadlock hatası

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

deadlock hatası

Mesaj gönderen baloglurecep »

saygıdeğer programcı arkadaşlar... Uzun zamandır forma giremedim. Programcılığa da farklı programlar, nesnelerin interneti, robotik kodlama ile kendimi geliştirmek üzere farklı kurslara , çalışmalara yöneldim. Yıllar önce yazmış olduğum cari programımım çok kullanıcı şekilde kullanılıyordu. Yıllardır belki de farkında olmadığımız bir hata tespit edildi. Hata sonrası biraz araştırma yaptım. Sorunu yaşamadığım için bilmiyordum. Bilenler bilir de hatayı kısaca yazayım.

Çoklu kullanımda bir bilgisayarda bir cari kart açılmış ve işlem yapılmış olsun. (commit edilen bir işlem). Eğer bu işlem arkasından başka bir kişiye ait cari kart açılmadan, işlem (commit) yapılmadan başka bilgisayarda aynı kişiye ait bir işlem açılıp commit edilirse DEADLOCK hatası veriyor. Vermemesinin tek yolu işlem sonrası başka birine cari işlem yapmak.

sorum şu: projeyi tekrar gözden geçirmeden bu sorunu çözebilir miyim? Firebird dosyaları üzerinden bu hatayı gidermenin yolu var mıdır? firebird üzerinden yoksa basit şekilde projede transcation ayarlarından bir ayar ile bunu giderebilir miyim? Kısaca seçeneklerim var mıdır? Firebird 2.0 versiyon kullanıldı. Delphi 7 ile yazıldı. Fibplus bileşen setiyle data bağlantısı yapıldı. Transcation ayarları aşağıdaki gibidir.

timeout:0
timeautaction:TARollback
TPMBMode: tpbReadCommitted

Yorumlarınızı ve tavsiyeleriniz bekler sağlıklı, mutlu günler dilerim.
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: deadlock hatası

Mesaj gönderen ertank »

Merhaba,

Firebird ile çözülebilecek bir sorun değil.

Tavsiye olarak uygulamanızda kayıt giriş işlemlerini veritabanı bileşenleri ile yapmayın. TDBEdit kullanmayın. Bunun yerine TEdit kullanın. Veri kaydetme anında kısa süreli transaction başlatıp kayıt sonrasında commit edin. Böylece uzun süre açık kalan transaction olmayacağı için çoklu kullanıcı çakışma olasılığı çok düşük olacaktır.

Okumak için kullanılan tüm bileşenler (ekranda bilgi gösteren, değişiklik yapmayan) ReadOnly transaction kullanmalılar.

Dolayısıyla en azından iki tane transaction nesnesi ile çalışmalısınız.
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: deadlock hatası

Mesaj gönderen baloglurecep »

Teşekkkür ederim ERTANK hocam. Örnek mini bir çalışma yazıyorum. Hatayı tespit edip giderebilecekmiyim ona bakacağım. Data bağlanıları her kayıt güncellme sonrası otomatik commit etmekte.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: deadlock hatası

Mesaj gönderen freeman35 »

AutoCommit değilde, AfterPpost Eventinde CommitRetaing kullanın. DataSet deauto edit True yapın, form Açılırken TQuery yi edit moda geçirmeyin, kullanıcı değişiklik yaparsa auto geçer ve transaction başlar.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: deadlock hatası

Mesaj gönderen baloglurecep »

Teşekkür ederim Freeman35 hocam. Dedikerinizi belki projemde uygulayamam ama yeni projeler için rehberlik edecek bana...
Cevapla