SP

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ı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

SP

Mesaj gönderen serbek_tr »

Hayırlı Çalışmalar,

Arkadaşlar çok soru soruyorum belki ama ne yapalım sormadan öğrenilmiyorum.
şimdi

Kod: Tümünü seç

  Data.Update_SP.Params[0].AsString := SQLTEXT;
  Data.Update_SP.ExecProc;
  Data.BaseSale_Transaction.CommitRetaining;
şeklind bir olay var bu durumda procedure ün işi bitinceye kadar delphi tarafında beklemek zorundayız bunun bir de uzak bağlantıdan yapıldığını düşünün mesela ben bu procedüre ile 10.000 adet kayıt üzerinde bir kerede farklı updatler yapıyorum ki localde 5 sn sürüyor uzak bağlantıda eminim bağlantısına göre 1 dk yı bulur belkide geçer. procedure işlemi bittikten sonra commit işlemi var procedure işi bitmeden bağlantı koptu yada elektrik kesildi bunlar ihtimaller yapılanlar kayda alınmaz

1. commit olayını procedure içinden gerçekleştirebilirmiyim
2. gerçekleştirdiğimizi farz edelim yukarıdaki ihtimaller dahilinde bir kesilme oldu diyelim procedure işi bitmeden procedure işini bitirirmi ve commit olayı gerçekleşirmi
3. commiti procedure içinden yapabildiğimiz farz edelim procedure ün işini bitirmesini beklememe mümkünmü yani ben parametreyi gönderdiğim anda delphi tarafında alakam kalsın istemiyorum iş benden çıksın ve ne olursa olsun ben Data.Update_SP.ExecProc; komutunu verdikten sonra iş veritabanında gerçekleşsin
4.commit procedure tarafında olmassa bile 3. de söylediklerim mümkünmü

teşekkürler
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

evet ilginç bir soru. ben yanıtı bilmiyorum. bildiğim kadarıyla server tarafında da bir yazılımımız olmadığı müddetçe mümkün değil (yani proc kontrolünü yapacak, bekleyecek commit edecek). multi-tier yapı konusunda görüşüldü bu gerçi. böyle birşey olabilir.

cevabı bilen arkadaşlar yazarsa iyi olur.
snofru
Üye
Mesajlar: 204
Kayıt: 19 Ağu 2004 02:57
Konum: /local/usr/src
İletişim:

Mesaj gönderen snofru »

S.a
Bildiğim kadarıyla ( yanlış bilmiyorsam ) cevap vereyim;

1- Evet.. COMMIT yada COMMIT WORK gibi komutlar denenerek bulunabilir yada SUSPEND de o işlemi gerçekleştiriyor olabilir.
2- Eğer milisaniyelik Commit olayında elektrik kesilirse şansına küsersin, ancak bu da milyarda bir gibi bir ihtimal bence...
3- Zaten öyle olmalı... Ancak bilemiyorum ki Delphi içinden çağrılan SP lerde durum ne olur, tahminimce işlevi gönderir işi VT ye yıkar ve keyfine bakar.
4- 8)

Sevgiler...

Taner DOĞAN
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: SP

Mesaj gönderen sadettinpolat »

serbek_tr yazdı: 1. commit olayını procedure içinden gerçekleştirebilirmiyim
bildiğim kadarıyla hayır

http://forums.devshed.com/archive/t-174 ... -procedure
serbek_tr yazdı: 2. gerçekleştirdiğimizi farz edelim yukarıdaki ihtimaller dahilinde bir kesilme oldu diyelim procedure işi bitmeden procedure işini bitirirmi ve commit olayı gerçekleşirmi
commit olayı bir şekilde program tarafından gönderilmezse büyük ihtimalle sp nin yaptığı işlemler geçersiz olacaktır.
(ibtransaction üzerinde commitle ilgili bazı ayarlar var.)
serbek_tr yazdı: 3. commiti procedure içinden yapabildiğimiz farz edelim procedure ün işini bitirmesini beklememe mümkünmü yani ben parametreyi gönderdiğim anda delphi tarafında alakam kalsın istemiyorum iş benden çıksın ve ne olursa olsun ben Data.Update_SP.ExecProc; komutunu verdikten sonra iş veritabanında gerçekleşsin
böyle birşey yapılabilir mi bilmiyorum fakat thread kullanarak veya başka bir program çağırıp Data.Update_SP.ExecProc; prosedürünü çağırıp buna benzer birşey yapılabilir gibi -ne kadar güvenli ve ne kadar ek yük getirir ???-
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: SP

Mesaj gönderen sadettinpolat »

serbek_tr yazdı:mesela ben bu procedüre ile 10.000 adet kayıt üzerinde bir kerede farklı updatler yapıyorum ki localde 5 sn sürüyor uzak bağlantıda eminim bağlantısına göre 1 dk yı bulur belkide geçer.
burda local veya internet bağlantısının sonucu fazla değiştirmemesi gerekir. sonuçta sizin db ye gönderdiğiniz sadece sql cümlesi.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
onaydin

Mesaj gönderen onaydin »

-1. commit olayını procedure içinden gerçekleştirebilirmiyim
burada geçmişti, maalesef farzedemiyoruz.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Diğer sorduğun mesajla bağlantılı.
10,000 kayıt için hepsi için olmasa bile sanırım 1,000 tanesi bile olsa yeterde artar bile :)
Kesinlikle SP ve trigger kullanmalısın, yani bir table a yapılan kayıt sonucu toplam hesaplamalr vs gerekiyor. Bunu sebep olan table ın triggerlarıyla helledersen 10,000 kayıt ile uğraşmaz sadece sebep olan table ın 1 row u ile uğraşmış olursun.

Transaction içinde eğer beklemezse çok büyük problem olurdu :) çünkü bir bilgiyi db ye gömmeye çalışırken işlem kopukluğu olursa db nin bozulmasını engellemek için bu işlem parçası önce bir başka file olrak kaydedilir (lck dosyaları) commit dendiğinde bu dosya block halinde db ye gömülür. yani commit işlemi mutlaka işlemin tamamlanmasını beklemek zorunda.

Şöyle bir geçici çözüm olabilir ama ben bu senin bahsettiğin gibi çok fazla adetli ve çok sık tekrarlanan işlemler için önermiyorum.

CachedUpadete kullanabilirsin. Bu bilgi grubunu server üzerinde değil local makinada yapar, ApplyUpdates dedndiğinde server a gönderilir. Serverda bunu önce transaction a alır commit ide görünce tüm bloğu db ye gömer.

Ama bence trigger ve sebep table üzerine yoğunlaşmanda fayda var

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

Mesaj gönderen gkimirti »

sahsi fikrime gore, eger islem bitmeden server ile baglantı koparsa soyle bir durum olması lazım,

client tarafında commitretainnig islem gormeden bir exception olusabilir, bunu deneyip gormek lazım, eger boyle olursa try except ile kontrol edilebilir.

server tarafında transactionı sonlandıracak bir isaret gelmedigi icin hala transaction acık olabilir.
en iyisi sp ye donguler koyarak bir denemesini yapmak.
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

Mesaj gönderen serbek_tr »

Arakdaşlar sorularınıza tek tek cevap vermedim mümkün olduğunca yorumları bekledim;(yapılan tüm yorumları tek yorum olarak değerlendirip ona göre cevap veriyorum arkadaşlar).

Commiti denedim procedur tarafında olmadı syntaxt error veriyor.
procedure işini bitirmeden hemen arkasından gelen commit işe yaramayacak. dediğiniz gibi procedure try ile kontrol altına lasam bile sonuçta transaction başlayacak. try ile kontrol etmezsek commit hata verecek try ile kontrol etsek te etmesekte try bloğunda bir hata olduğunda commit görev yapmayacak ancak server tarafında transaction açık kalacak..
ayrıca procedure veritabanı kısmında gerçekleşiyor ama beklemekten başka çaresi yok çünkü procedure parametre alan ve veren bir yapıya sahip olduğu için bir sonuç istemezsek bile yani çıkış parametresi olmasa bile herhalde yapı olarak delphi tarafında procedure sonucunun beklenmesi gerekiyor(benim anladığım bu yanlışım varsa özür dilerim. ve dolayısı ile bağlantının local yada net olasından bu durumdan kaynaklanan süre uzamaları olabiliyor kanaatindeyim)
sonuç ne .... bağlantı kopmasın diye umut ve dua etmek

editledim*******************

bu arada transaction un açık kaldığını düşünürsek bu durum başka yerlerden yapılan bağlantılarda sorun teşkil edermi yoksa başka bir tarafın commit olayı bunu düzenlermi sorun yaratırsa düzenleme ihtialide olmalı diye düşündümde
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

try
....işlem
except
...transaction u iptal et
end;

diyebiliriz o zaman
bekleme konusuna gelince, update vs. islemler server tarafında calısacagı icin net yada lan hic farketmemesi lazım
yanı yerel ag da 2-3 saniye alıyorsa net uzerinden bu islem yine 2-3 saniye surecektir.
ÜŞENME,ERTELEME,VAZGEÇME
Cevapla