isolation level + deadlock

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
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

isolation level + deadlock

Mesaj gönderen comfort »

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 :twisted: .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.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

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ı.
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Mesaj gönderen comfort »

@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:
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

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.
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Mesaj gönderen comfort »

coderlord yazdı: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.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

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 firebird lock olarak aratıp ilk bulunan sayfaya bakabilirsin :)
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Mesaj gönderen comfort »

sadettinpolat yazdı:fb 1.5 te

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

hemen deniyorum umarım işimi görür
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Mesaj gönderen comfort »

Evet sanırım problem çözüldü gibi ama sorgudan 'for update' deyimini çıkarmam gerekti yani

Kod: Tümünü seç

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. :?: :?: :?:
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

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
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Mesaj gönderen comfort »

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. :!:
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 :?: :?: :?:
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Mesaj gönderen comfort »

: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
Cevapla