BeginTrans Modunda iken diğer kullanıcılar kilitleniyor.

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

BeginTrans Modunda iken diğer kullanıcılar kilitleniyor.

Mesaj gönderen tuna »

Arkadaşlar yaptığım projede bildiğiniz fatura kayıt mantığıyla çalışan bir teklif kayıt modülüm var. Bu modüldeki gridi kullanıcı ürün seçerek dolduruyor vs..
Kullanıcı yeni kayıt butonuna basıyor ve tablo begintrans modunda açılıyor taaki kaydet deyinceye kadar begintrans da kalıyor. Kullanıcı kayıt deyince committrans oluyor vazgeçerse rollback oluyor. Buraya kadar sorun yok.
Fakat kullanıcı yeni kayıta tıklayıp begintrans moduna geçince diğer kullanıcıların hiçbirisi o tabloyu açamıyor. Ne veri çekebiliyor nede bişey yazabiliyor. Kullanıcı commit veya rollback yapınca herşey normale dönüyor.
Enterprise arayüz den bile ben tabloyu açamıyorum. Zaman aşımı oldu filan diyor.

Kullandığım sql MSSQL 2000
Delphi 2007 kullanıyorum
Bilgisayarların hepsi win xp
Yaklaşık 60-70 Kullanıcı var

Arkadaşlar gerçekten sıkışmış durumdayım. :( Formu ve web sitelerinde aramaya devam ediyorum bir yandan.

Şimdiden üstatlarımın hepsine teşekür ederim.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: BeginTrans Modunda iken diğer kullanıcılar kilitleniyor.

Mesaj gönderen conari »

SQL sorgularında tabloları açarken with no lock kullanırsanız daha iyi olur.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: BeginTrans Modunda iken diğer kullanıcılar kilitleniyor.

Mesaj gönderen tuna »

Peki başka bir yöntem yokmudur. Bir sürü formda aynı tabloyu kullanan query neslerim var ve bunlarında birsürü alt sorguları var.
Her birine gidip tek tek with nolock mu yazmam gerekecek....

Sql serverdan filan halledememmi. Veya başkaları nasıl yapıyordur bu gibi işlemleri
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: BeginTrans Modunda iken diğer kullanıcılar kilitleniyor.

Mesaj gönderen mkysoft »

Sipariş numaralarının atlamaması gerekiyor sizin için galiba. Bende de benzer bir durum var ben bunun için şöyle bir mantık kurdum. Tabloyu normal açıyorum ama chached updates kullanıyorum. yani hiç bir veriyi veri tabanına yazmıyorum sadece client'ın hafızasında bulunuyor. Kullanıcı kaydet dediğinde sipariş numarası alınarak tüm veriler tek seferde yazılıyor. Memtablelarda kullanılabilir ama tekrar tekrar onları oluşturup verileri aktarmak zaman kaybı, cachedupdates güzel bir özellik.
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: BeginTrans Modunda iken diğer kullanıcılar kilitleniyor.

Mesaj gönderen tuna »

sipariş numarası atama işleminde de kullanıyorum ama asıl kullandığım yer teklifi kaydetme kısmında gride grilen bilgileri kullanıcı kaydet diyene kadar begin trans modunda bekliyor. Veya kullanıcı kaydedilmiş teklifi açınca grid üzerindeki verileri değiştirip kaydete basıncaya kadar begin trans modunda bekliyor. vazgeçerse roll back kaydederse commit oluyor. Bunlarda bir sıkıntı yok ama sorun yukarıda belirttiğim gibi. Peki bu chaced update olayı nedir nererden yapılır biraz açıklayabilirmisiniz. (Not: microsoft SQL kullanıyorum)
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: BeginTrans Modunda iken diğer kullanıcılar kilitleniyor.

Mesaj gönderen sabanakman »

Bu durumda transaction başlatma ile bitirmeyi bir anda yapmanı öneririm. Kayıt giriş ekranları geçici tutulan bilgiler olmalı ve kaydet butonuna bastığı anda transaction başlamalı ve bitmeli (normal tamamlanan commit, hata durumunda rollback). Böylelikle kimse de beklemek zorunda kalmaz. Tabi bu geçici kayıt giriş tekniği size kalmış. İster sql tablosu oluşturursunuz, ister sanal tablo (#tablo_adi) isterseniz delphi bileşenleri (MEMTable, ClientDataSet v.s.), yöntem size kalmış.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: BeginTrans Modunda iken diğer kullanıcılar kilitleniyor.

Mesaj gönderen tuna »

Kayıt kilitleme işlemi bir anda başlatıp bitirmem mümkün değil. Çünkü kullanıcı grid üzerinde değişiklik yapıyor. Ve biliğiniz gibi grid üzerinde yapılan değişiklikler anında tabloya yazılıyor. Ama benim yaptığım kullanıcı kaydet diyene kadar bunların begin trans modunda kalması. Çünkü kullanıcı değiştirdiği giridi vazgeç deyip çıkabilir. Bu işlemi geçici tablo kullanarak yapıyordum ama tam olarak istediğim olmuyordu. Ve kodlamasıda zaman alıyordu. Bende bu transaction olayını keşfettim ve programımı buna göre değiştirdim. Ama şimdi karşıma böyle bir sonuç çıktı. Ve gerçekten çok hızlı bir şekilde çözmem gerekir. Hiç muhasebe programı yazan arkadaş yokmu aramızda. Acaba fatura modülünü nasıl yapmışlardır. Çünkü yazdığım programdaki bu kısım fatura modülündeki gibi çalışıyor. Kullanıcı ürünü seçiyor ürün gride ekleniyor sonra kullanıcı griddeki diğer bilgileri dolduruyor miktar fiyat vs.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Re: BeginTrans Modunda iken diğer kullanıcılar kilitleniyor.

Mesaj gönderen Hakan Can »

BeginTrans vs. normalde çok özel amaçlı kullanılması gereken yöntemler. Nedenleri zaten izah edilmiş. Bu tip uygulamalarda farklı yaklaşımlar kullanmak daha uygun olacaktır.

Şahsen ben bir fatura girilirken veritabanına direk yazdırırım. Kalemleri de aynı şekilde direk yazdırırım. Tek yapacağım şey fatura tablosuna (yani master tabloya) onay alanı koymak. Misal FATURA_ONAY_TARIH_SAATI vs. İlk etapta bu alanı boş (NULL) girip bilahare kullanıcı onay verdiğinde bu alana mevcut tarih-saati girerim. Onay vermez ise ikaz eder, bu ve bağlı kayıtları silerim.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: BeginTrans Modunda iken diğer kullanıcılar kilitleniyor.

Mesaj gönderen conari »

tuna yazdı:Hiç muhasebe programı yazan arkadaş yokmu aramızda. Acaba fatura modülünü nasıl yapmışlardır.
Muhasebe ile Fatura ayrı şeyler karıştırmayalım.
Ben fatura yazmadım ama gördüğüm bir kaç uygulamadan bilgi vereyim.

Fatura üst bilgileri ve toplam bilgileri master tablo
fatura ek bilgileri
detay tablo stok hareketleri

fatura üst bilgileri stok girişi olmadığı sürece yazılmıyor. bir stok girişi olduktan sonra fatura üst bilgileri ve stok hareketi vt ye yazılıyor. aynı satır update edilir ise üst bilgiler ve hareket tabl. düzeltiliyor. Tabi kaydın tamamlanmadığı bir alan da tutuluyor.
Pc kapanmasında vs. bu alan tamamlanmadığından kullanıcı aynı modülü açtığında gösteriliyor.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: BeginTrans Modunda iken diğer kullanıcılar kilitleniyor.

Mesaj gönderen sabanakman »

tuna yazdı:Kayıt kilitleme işlemi bir anda başlatıp bitirmem mümkün değil. Çünkü kullanıcı grid üzerinde değişiklik yapıyor. Ve biliğiniz gibi grid üzerinde yapılan değişiklikler anında tabloya yazılıyor. Ama benim yaptığım kullanıcı kaydet diyene kadar bunların begin trans modunda kalması....
sabanakman yazdı:Bu durumda transaction başlatma ile bitirmeyi bir anda yapmanı öneririm. Kayıt giriş ekranları geçici tutulan bilgiler olmalı ve kaydet butonuna bastığı anda transaction başlamalı ve bitmeli (normal tamamlanan commit, hata durumunda rollback). Böylelikle kimse de beklemek zorunda kalmaz. Tabi bu geçici kayıt giriş tekniği size kalmış. İster sql tablosu oluşturursunuz, ister sanal tablo (#tablo_adi) isterseniz delphi bileşenleri (MEMTable, ClientDataSet v.s.), yöntem size kalmış.

Demem odur ki bu modülleri yaptık ve direk tabloya bağlamadık. Kayıtlar ekranda (gridlerde) geçici yöntemlerle tutuldu ve kaydet tuşuna baıldığı anda transaction başlatıldı ve o ekrandaki kayıtlar ilgili yerlere atıldı. Maşallahı var canavar gibi çalışıyor ama başka yöntemlere de başvurabilirsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: BeginTrans Modunda iken diğer kullanıcılar kilitleniyor.

Mesaj gönderen tuna »

Yani diyebilirmiyiz ki; begin trans başlayıp commit veya rollback ile bitinceye kadar diğer kullanıcıların hiçbir şekilde bu tablolar üzerinde işlem yapması mümkün değil. Bunun kesin olduğunu bilirsem daha fazla diretmeden kodlarımı geçici tablolar şeklinde değiştireceğim.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: BeginTrans Modunda iken diğer kullanıcılar kilitleniyor.

Mesaj gönderen conari »

Bence çok mantıksız.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: BeginTrans Modunda iken diğer kullanıcılar kilitleniyor.

Mesaj gönderen tuna »

conari yazdı:Bence çok mantıksız.
Bencede böyle birşey olmaması lazım değilmi?.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: BeginTrans Modunda iken diğer kullanıcılar kilitleniyor.

Mesaj gönderen aslangeri »

s.a.
select ifadende with no lock dersen selectler için kayıtlar kilitlenmez.
ancak transaction başlatıp bir kayıt üzerinde update yaptığın zaman diğer bir kullanıcının o kayda ulaşamaması normal.
bunun için adoconnection bileşeninin isolationlevel özelliğini biraz kurcala.
bene tam detayını bilemiyorum ama aradığın şey orda gibime geliyor.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: BeginTrans Modunda iken diğer kullanıcılar kilitleniyor.

Mesaj gönderen tuna »

aslangeri yazdı:s.a.
select ifadende with no lock dersen selectler için kayıtlar kilitlenmez.
ancak transaction başlatıp bir kayıt üzerinde update yaptığın zaman diğer bir kullanıcının o kayda ulaşamaması normal.
bunun için adoconnection bileşeninin isolationlevel özelliğini biraz kurcala.
bene tam detayını bilemiyorum ama aradığın şey orda gibime geliyor.
kolay gelsin.

Diğer kullanıcılar zaten oan begin transactionda olan kayıdı görmesin tamam. Ama o tabloyu açabilsin. Burada problem diğer kullanıclar kesinlikle begin transda olan tabloyu açamıyor.
AdoConnection'un dediğiniz iso level ayarlarıylada oynadım hepsini tek tek denedim ama. yok maalesef.

Tabloya with nolock ifadesi kullanarak erişmem mümkün ok.Orada bir problem yok. Ama bu tabloyla işlem yapan okadar çok sql komutlarım varki tek tek değiştirmem çok uzun zamanımı alır. Çünkü bu tablo ve bunun gibi tablolarda çalışan daha bir sürü sql kodlarım var. İşin kötü tarafı bu tablolarda çalışan trigger ve storedproc larım da var... :(

Lütfen yardım... Çık zor bidurum. :cry:
Cevapla