isolation level + deadlock
comfort16.02.2005 - 12:46:30
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)Exclaim.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 Twisted Evil .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.
 
coderlord16.02.2005 - 13:18:45
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ı.
 
comfort16.02.2005 - 17:25:08
@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) Evil or Very Mad
 
coderlord16.02.2005 - 17:29:01
Yetersiz olan nedir anlamadım?

Kilit alanını true yaptığında kullanıcın kayıtta nasıl çalışmaya devam edecek?

Çok kullanıcılı bir uygulamada aynı anda kilit alanını true yaparlarsa ne yapılacak?

Boğuşmak zorunda olduğun çok şey var. Ancak transaction belgelerini okursan istediğine ulaşabilirsin diyorum halen.
 
comfort16.02.2005 - 18:05:50
Yetersiz olan nedir anlamadım?

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.
 
sadettinpolat16.02.2005 - 18:25:17
fb 1.5 te

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 http://www.google.com/search?hl=tr&q=firebird+lock&lr= olarak aratıp ilk bulunan sayfaya bakabilirsin :)
 
comfort17.02.2005 - 09:27:12
fb 1.5 te

Select ... From Table [Where ...] [Order By ...] For Update With Lock

hemen deniyorum umarım işimi görür
 
comfort17.02.2005 - 10:26:44
Evet sanırım problem çözüldü gibi ama sorgudan 'for update' deyimini çıkarmam gerekti yani

select * from my_table where id=5 with lock

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. Question Question Question
 
gkimirti17.02.2005 - 10:29:26
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
 
comfort17.02.2005 - 11:22:47
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.:D 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. Exclaim
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 Question Question Question
 
comfort17.02.2005 - 11:42:48
Bravo :alkis: :D :P
Everything OK

Arkadaşlar şimdilik bir sorun yok gibi yardımcı olan herkese teşekkür ederim
Allah yolunuzu açık etsin
 
NOT : Bu sayfa google'un siteyi indekslemesi içindir. www.delphiturkiye.com/forum/ adresini kullanınız!
1998-2006 www.delphiturkiye.com