Herkese iyi çalışmalar diliyorum;
Firebird 1.5 VTYS kullanıyorum.Firebird serverım anamakinaya kurulu ve diğer terminaldeki kullanıcılar bu servera bağlanarak vt'ye ulaşıyor.Delphide transaction ın isolation levelini read commited olarak ayarladım(Diğer hepsinide denedim):!:.Problem şu:Bir kullanıcı bir kayıt üzerinde işlem yaparken başka bir kullanıcıda bu kayıt üzerinde işlem yapıyor .Dolayısıyla karışıklıklar çıkıyor.Mesela Biri bu kaydı güncellerken diğeri siliyor.Şimdi benim tek istediğim kullanıcı başka kullanıcının o an üzerinde olduğu kaydı açarsa yani diyelimki navigation esnasında veya güncelleme penceresini açtığında karşısına bir mesaj gelsin, örneğin: Şuan bu kayıt üzerinde başka bir kullanıcı çalışıyor lütfen kısa bir süre sonra tekrar deneyin gibi mesela.İsolation levelleri denedim ama deadlock hatası alıyorum.Bilen arkadaşlar yardımcı olurlarsa sevinirim.
Bunu yapabilmen için transaction'lar ve isolation level'lar hakkında iyi bilgi sahibi olman gerektiği için sana Interbase 6'nın pdf'lerini öneriyorum. Transaction başlığı altında hangi level, hangisinin update'ine izin verir, hangisi vermez sorusunun cevabını bulabilir ve istediğinizi yapabilirsiniz.
Firebird'un sayfasında dökümanlar bölümünde bu pdf'leri bulabilirsiniz.
En azından şunu söyleyeyim.
Read commited NOWAIT transactionlar, transaction oturumu başladığından itibaren veritabanına yapılan ve commit edilen değişiklikleri görebilir. (Mesela snapshot trans. göremez. Snapshot'lar transaction başlatılmadan öncekileri görebilir.) Ancak başka bir read commited trans. daha önce insert veya update yapmışsa ve değişiklikleri commit etmemişse, önceki trans.'nda yapılacak bir değişiklik isteği "lock conflict" ile sonuçlanır. Diğer trans. commit etmesi beklenir. Read commited WAIT olsa idi, diğer trans. commit edene kadar beklenecek, commit edince de değişikliği yapacaktı.
@coderlord cevabın için teşekkürler ama benim farkettiğime göre isolation leveller bu konuda biraz yetersiz kalıyor.Şöyle bir yolda var.Tablonun sonuna "Kilit " diye boolean bir alan ekleyip hangi kayıtta çalışıyorsam onun kilit alanını True yaparım işim bitincede False yaparım ama bu hiç efektif bir yol değil bence.Bu işi VT kendisi yapsın istiyorum koskoca firebird bunu yapamayacakmı (ki öyleyse yazıklar olsun)
Kilit alanını true yaptığında kullanıcın kayıtta nasıl çalışmaya devam edecek?
coderlord beni yanlış anladın sanırım.Kilit diye bir alan yarattığımda sorunlarım çözülecek tahminimce.Benim demek istediğim programda yavaşlamaya sebep olabilirmi endişesindeyim .
Yetersiz olan şey ise bu işi isolation level in yapmaması. Sürekli deadlock oluyor.
Select ... From Table [Where ...] [Order By ...] For Update With Lock
bu tarz bir kullanım mevcut. ama normal projelerimde hiç kullanmadım.
bildiğim kadarıyla deadlock hatasını vermesinin nedeni kullanıcılardan birisi x kaydını değiştirmiş ardından post işlemini yapmış fakat commit etmemiştir. bu durumda 2. kullanıcı x kaydını düzenleyip post komutunu verdiğinde deadlock hatası ile karşılaşır. bu durumda post işlemine bir try except koyup deadlock hatası aldığın zaman bunu kullanıcıya bildirir ardından ne yapmak istediğini kullanıcıya sorarsın. duruma göre hareket edersin.
nasıl yapılacağı hakkında pdf lere bakabilir veya
googledan firebird lock olarak aratıp ilk bulunan sayfaya bakabilirsin
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.
kodunu bir IBQuery nesnesinin içinde çalıştırıyorum sanırım düzgün çalışıyo.Ama for update eklediğimde hiç kayıt getirmiyor.IBSQL ile denedim gene çalışmadı.Burada for update deyiminin olması gereklimi yada bana ne faydası var.
aynı sql ile ikinci bir kullanıcı baglandıgında sorun cıkıyormu,
yani kayıtları select etmek icn bir kilit konmus ise diger kullanıcı goremeyebilir. o yuzden sadece update icin kilit atılıyordur.
bu konuda daha onceden bir kac yazısma gecmisti forumda arayarak bulabilirsiniz
hayır çok denedim başka kullanıcı bağlandığında sadece kilitli olan kayıda erişemiyor ki benim istediğimde tam olarak buydu. Diğer kayıtlara erişebiliyor.Nasıl release edieceğini araştırıyorum sanırım rollback veya commit edince kaydı bırakıyor .Şimdi tek mesele kullanıcıya türkçe bir mesaj verdirmek.
Yani: Şuan bu kayıt üzerinde işlem yapılıyor.Lütfen daha sonra deneyin
gibi bi mesaj bunun için firebird hata kodları gerekli zannediyorum veya başka nasıl yapılabilir