transaction ve commit

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

Sayın @nitrokonat;
Sorularına cevap olabilecek bir makale hazırladım ve makaleler bölümüne attım.
Kolay Gelsin.
mero
Üye
Mesajlar: 109
Kayıt: 04 Mar 2005 04:54

Mesaj gönderen mero »

S.A arkdaşlar

NewMember Ellerine sağlık makale güzel olmuş. Ama bir noktayı atlamışsın. IbTransaction ın Commit veya CommitRetaining olayını. Onuda zannedersem Commit hadisesi ile gerçekleştiriyorsun.

Nitrokonatın gönderdiği programı da görüntüleri de izledim. Programda Event alert olayında

Kod: Tümünü seç

if eventname='yeni' then begin
ibtransaction1.Commit;
 ibtable1.Open; end;
Transaction commit etmiştin. dolayısı ile çalışlıyordu problem yoktu. Ama videoda CommitRetaining kullandığın için bende programı değiştirip denedim çalışımıyor. Ha birde unutmadan videoda hep update yapıyorsun ama deneme tablosu da sadece after insert olayına trigger yazmışsın. ben insert ederek denediğim halde CommitRetaining çalışımoyordu. Yani trigger eventlara mesaj göndermiyor. Muhtemelen veri tabanınada yazmıyor.
Ben normalde her zaman commiti kullanıdığım için programlarımda bir sıkıntı olmadı. Ama formda okuduğum kadarı ile CommitRetaining de Commit ile aynı işiyapması gerekiyor. Yaptığım denemelerde gördüğüm kadari ile aynı işi yapmıyor.

Biraz karıştırdım zannedersem. Nitrokonatın programını indirip button1 in altına

Kod: Tümünü seç

ibtransaction1.Commit;
IBTable1.Open;
ibtable1.Refresh;
yazın 2 tane exe çalıştırın kayıt girdikten sonra birinci exede button1 e basın sonra ikinci exe de button1 e basın kayıtların eşitlendiğini göreceksiniz.


Button1 altındaki kodu:

Kod: Tümünü seç

ibtransaction1.CommitRetaining;
IBTable1.Open;
ibtable1.Refresh;
olarak değiştirin. aynı olayı tekrar denediğinizde kayıtların eşitlenmediğini göreceksinizki(tecrübe ile sabittir.)

El Hasıl: Commit komutu, tamam az çok biliyor ve kullanıyoruz. CommitRetaining ne işe yarar nasıl kullanılır. Veya bizmi bir yerde yanlış yaptık...

Bilen arkadaşların cevaplaması dileği ile Saygılar.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Commit ten sonra Transaction a bağlı tüm DataSet ler kapatılırken CommitRetaining de DataSet ler kapatılmaz. Aralarındaki bu farka dikkat etmek gerekir :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
mero
Üye
Mesajlar: 109
Kayıt: 04 Mar 2005 04:54

Mesaj gönderen mero »

rsimsek:
Commit ten sonra Transaction a bağlı tüm DataSet ler kapatılırken CommitRetaining de DataSet ler kapatılmaz. Aralarındaki bu farka dikkat etmek gerekir
Ben farkdan ziyade benzerliği merak ediyorum abi. Formda bir çok yerde ikisininde aynı işi yaptığını sadece farkın sizin değidiğiz gibi kapanma farkı olduğu yazıyor.

nitrokonat :
www.konat.net/event.rar bu örnekte ben exeyi 2 kere çalıştırıyorum.
exelerin birinden bir kayıt girdiğim zaman diğerinde de hemen görünsün istiyorum.
ama commitretaining ile yapınca olmuyor.
illa ki commit demek lazım.
sorusu üzerine CommitReatining i inceledim. Haklı illaki commit demeden veri tabanına yazmıyor. Ve ya kullanımı committen farklı nitrokonat ta bende commit gibi kullandığımız için çalıştıramadık.
Merak ettiğim CommitRetaining i Commit gibi kullanabiliyor muyuz? Eğer cevap evet ise nasıl? Örnek verebilirmisiniz?
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

mero yazdı:S.A arkdaşlar

NewMember Ellerine sağlık makale güzel olmuş. Ama bir noktayı atlamışsın. IbTransaction ın Commit veya CommitRetaining olayını. Onuda zannedersem Commit hadisesi ile gerçekleştiriyorsun.
.
Haklısın orayı belirtmeyi unutmuşum.Ben kendi programımda kayıt ekleme, sil ve diğer işleri bir base formdaki butonların altına bir kez yazdım.Ondan sonra şimdi unuttum bile. :lol: :lol: :lol:

Dolayısıyla o butonlarda her kayıttan sonra transactionu commitretaining ile commit ediyordum.Eğer gerekirse (Yani commit etmemem gereken durumlar yani) bu kodu kırıp yerine dilediğim kodu yazıyorum.Ama her kayıttam sonra commit etmeyenler bu refresh olayını görebilmeleri için commit olayını unutmamalı.
Transaction olayıunı burada belirtmeyi unutmuşum.Ama dediğim gibi benim programımda bu olay işliyor.En son 3 gün önce ağda 3 bilgisayar da bu kodun işlediğini gördüm.

Commit retaining olayını zaten Recep abim açıklamış.

Ama burda şöyle birşey de var.Bu konu daha öncede forumda konuşulmuştu ve bu tür anında refresh yapmaların belirli bir zamandan sonra sakınca olabileceği gibi konular ortaya atılmıştı.Belki topik bu tarafada biraz kayarsa değişik bilgiler ve/veya alternatifleer öğrenebiliriz.
Herkese kolay gelsin.
En son NewMember tarafından 26 Eki 2006 09:53 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Yukarıda yazdığım gibi fark Tablo/Sorgu (DataSet) lerin kapatılıp kapatılmaması. Yoksa her ikisinde de aktif-mevcut transaction kapatılıp bilgileri veritabanına kalıcı olarak yazılmakta. CommitRetaining de kaydedilen bilgilerin görünmemesi nasıl olmaktadır? Mevcut tabloyu ya da sorgu/query yi kapatıp tekrar açmazsanız doğal olarak kaydedilen bilgileri göremezsiniz. Çünkü o tablo/sorgu lar bir önceki transaction da kaldığı için yeni açılan transaction u kapsamadığından (transaction lar birbirlerinden yalıtılmış olduğundan) veritabanının son durumunu algılmayacaklardır. Belki "CommitRetaining den sonra yenilenen transaction un içinde açılmadıklarından son kaydedilenleri göremiyeceklerdir" şeklinde daha uygun bir tarif olabilir :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

parmakların dert görmesin mero kardeş. Derdimi bir türlü anlatamıyordum. Sırf bu nedenle video çektim ama yine de anlaşılmadı.
bu olaylardan anladım ki veritabanını commit etmezsek (bu şartlar altında) diğer exeler yeni kayıtları ve değişiklikleri almayacaklar.
Kullanıcı avatarı
Ademkoysuren
Üye
Mesajlar: 83
Kayıt: 26 Ağu 2003 03:07
Konum: KIRŞEHİR
İletişim:

Mesaj gönderen Ademkoysuren »

datasetinizi kapatıp açmadan güncelleme(refresh) etmek için

ibx.refresh;
ibx.CanModify;

kodu yeterlidir
Cemre Bilgisayar Yazılım
KIRŞEHİR
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

söz konusu denemelerde dataset kullanılmamıştır.
bilgi için teşekkürler.
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

Ademkoysuren yazdı:datasetinizi kapatıp açmadan güncelleme(refresh) etmek için

ibx.refresh;
ibx.CanModify;

kodu yeterlidir
Denedim ama çalışmadı...
mero
Üye
Mesajlar: 109
Kayıt: 04 Mar 2005 04:54

Mesaj gönderen mero »

S.A
Evet arkdaşlar tahmin ettiğim gibi ben ve @nitrokonat arkadaş CommitRetaining kullanırken hata yapmışız. Bundan dolayıda CommitRetaining i kullandığımızda gidip veri tabanına yazmıyor.

Yanlışımız:

IBTransaction ın isolation level ini Read committed yapmadan CommitRetaining çalışmıyor.

Vede
NewMember demiş ki:
Ademkoysuren demiş ki:
datasetinizi kapatıp açmadan güncelleme(refresh) etmek için

ibx.refresh;
ibx.CanModify;

kodu yeterlidir
Denedim ama çalışmadı...
Ben de Denedim ama çalışmadı...
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

mero yazdı:Yanlışımız:

IBTransaction ın isolation level ini Read committed yapmadan CommitRetaining çalışmıyor.
ben IBtransaction'da isolation level diye bi property bulamadım.
Delphi 7 kullanıyorum.
versiyonlarımız mı farklı ki?
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

transaction bileşenine çift tıklayın

ya da
params özelliğine Read Commited için aşağıdaki kodu yazın

Kod: Tümünü seç

IBtransaction.params.add('read_committed');
IBtransaction.params.add('rec_version');
IBtransaction.params.add('nowait');
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

işte çözüm bu,
emeği geçen herkese çok teşekkürler.
saygılarımla
bilal türk
Cevapla