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ı
selimr
Üye
Mesajlar: 556
Kayıt: 16 Eki 2003 02:07

transaction ve commit

Mesaj gönderen selimr »

sevgli arkadaşlar forumdaki bütün commit, commitreatening ve transaction hakkındaki yazıları okudum..

şimdi sonuçta şunu anladım doğrumudur yoksa benim kafammı karıştı..

kayıt işleme, silme veya düzenleme işlemleri yaptıktan sonra, transactionu commitreatening veya commit ( ki bu zaten datayı kapatıyor) ne yaparsak yapalım; güncel verileri diğer makinelerin veya benim görebilmem için sonuçta mutlaka database yi kapatıp açmamız gerekiyor..

doğrumudur..
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

merhabalar

Transaction bileşeni bir nevi geçici hafıza görevi görür ve sen Dataset e her post komutu gönderdiğinde işlenen kayıt Transaction da tutulur taki sen Commit veya CommtiRetaining diyene kadar. bu komutları verdiğin anda Transactionda tutulan bilgiler Database aracılığı ile ilgili Tabloya yazılır veya yazılırlar. Commit dersen Transaction bileşeni ile olan bağlantı disconnect olur. StartTransaction komutu tekrar connect olunur. CommitRetaining ile de bağlantı devemlılığını korur.

diğer kullanıcıların senin yaptığın değişikliği görmesi için Commit veya CommitRetaining comutunu göndermen gerekiyor. bu işlemde senin ne zaman commit gönderdiğini ise vt tarafında bir trigger oluşturup post_event tanımlayarak halledersin. ilgili trigger e hangi tabloda hangi olay olduğunda tetiklenmesi gerektiğini yazarsınız..

Örnek Post Event

Kod: Tümünü seç

CREATE TRIGGER MUSTERI_YENIKAYIT FOR MUSTERI
ACTIVE AFTER INSERT POSITION 0
AS
begin
  post_event'Musteri_Yeni_Kayit';
end
örnek kod da MUSTERI_YENIKAYIT isimli trigger tanımladık.

bir trigger tablonun 3 değişik halininde tetiklenir

1 - Insert = Yeni Kayıt
2 - Update = Kayıt Güncellendiğinde
3 - Delete = kayıt Silindiğinde

ve bu 3 değişik halin 2 farklı zamanı vardır

1 - Before = İşlemin Öncesi
2 - After = İşlem Sonrası
Bir mum, yanındaki mumları tutuşturmakla,
ışığında hiç bir şey kaybetmez.

Mevlana

OS win.10, IDE Delphi 10.3, RDBMS Firebird and MSSQL, BROWSER Chrome
Kullanıcı avatarı
selimr
Üye
Mesajlar: 556
Kayıt: 16 Eki 2003 02:07

Mesaj gönderen selimr »

sevgili kadir açıklamaların için teşekkürler..

söylemek istediğim özetle şu..

commitretaining yaptığımda verileri data üzerinde göremiyorum.. değişiklikleri görebilmem için commitretaining den sonradatabaseyi açıp kapatmam gerekiyor..

yani kısacası; ya commit yapıcam ki database otomatik kapanacak;
yada ben commitretaininin yaptıktan sonra database yi kapatıp sonra açıcam..

benin anladığım bu.. doğrumudur ..
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

işlemi yapan kullanıcı değişikliği görür ancak aynı tabloya farklı Database bilşeniyle bağlanıldığında diğer Database yapılan değişiklikleri göremez. ben kısa yoldan commit yapıp datayı yorma bir tigger tanımla ilgili işlem sonucu EventAlert bileşeni ile yakala ve kullanıcılara bildir. yapılan değişikliği görmek yada görmemek kullanıcılara bırakılsın demek istiyorum..

Saygılar...
Bir mum, yanındaki mumları tutuşturmakla,
ışığında hiç bir şey kaybetmez.

Mevlana

OS win.10, IDE Delphi 10.3, RDBMS Firebird and MSSQL, BROWSER Chrome
Kullanıcı avatarı
selimr
Üye
Mesajlar: 556
Kayıt: 16 Eki 2003 02:07

Mesaj gönderen selimr »

bak şöyle bir örnekle açıklamaya çalışayım..

diğer makinelerdeki kullanıcıları bir kenara bırakalım..

bir stok kartları tablosu var diyelim... burda kayıtlı skotlar var...

daha sonra yeni bir kart tanımladım, ekledim ve sonra transactionu commitretaining olarak yaptım...

şimdi tanımlama formunu kapattıktan sonra stok kartları arasında bu yeni tanımladığım stok kodunu aradığımda yok görünüyor.. ama database yi açıp kapattıktan sonra görünüyor..

bilmem anlatabildimmi.. yani bu yeni tanımladığım ve commitretaining yaptığım yeni kaydı databaseyi açıp kapamadan göremezmiyim..
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

merhabalar bende aynı işlemi yapıyorum ve stok kartındaki değişikliği Dataseti close open yapmadan görüyorum. nasıl mı?

1 - Tablo Stok
2 - Tablo StokArama

bu iki tabloyu da aynı Database bileşenine bağlıyorum. 2.Dataset StokArama zaten üzerinde işlem yapılan bir Dataset değil sadece kayıt arama işleminde kullandığım için aynı Database bilşenine bağladığın zaman her hangi bir problem olmaz...
Bir mum, yanındaki mumları tutuşturmakla,
ışığında hiç bir şey kaybetmez.

Mevlana

OS win.10, IDE Delphi 10.3, RDBMS Firebird and MSSQL, BROWSER Chrome
Kullanıcı avatarı
selimr
Üye
Mesajlar: 556
Kayıt: 16 Eki 2003 02:07

Mesaj gönderen selimr »

bende sorun oluyor.. yani görünmüyor..

şöyle örnek üzerinde açıklayım

bir adet skartlar tablom var...

şimdi bu kartlardaki bilgileri görmek için..

select * from skartlar order by stokno ile örnek aşağıdaki sonucu aldım diyelim..

stokno adı fiyatı
-------- ---- -------
10 adı1 150
20 adi2 160

gibi...


daha sonra

insert into skartlar (stokno, adi, fiyati) values ( '15','adi3',185) diye bir kapıt ekledim ve commitretaining yaptım...

her iki query de aynı database ye bağlı..

bu kaydı ekledikten sonra; tekrar

select * from skartlar order by stokno

dediğimde son eklediğim kaydı göstermiyor.. ama database yi açıp kapattıktan sonra son eklediğim kaydıda gösteriyor..
mero
Üye
Mesajlar: 109
Kayıt: 04 Mar 2005 04:54

Mesaj gönderen mero »

Selimr nin söylediği olay zannerdersem query lerin farklı transaction lara bağlı olmasından kaynaklanıyor. Database aynı ama transactionlar farklı zamanında benimde başıma gelmişti.
Kullanıcı avatarı
selimr
Üye
Mesajlar: 556
Kayıt: 16 Eki 2003 02:07

Mesaj gönderen selimr »

sevgili mero; dedeğin doğru nasılda kaçmış gözümden.. teşekkür ederim..
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

http://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 vommit demek lazım.
aramalarım sonucu bu topici buldum. sorun aynı ama bende farklı query falan yok.
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

Kadirin söylediği yöntemle yapıyorum.Anında güncelleme yapıyor.Transactionnları kontrol etmek gerek.Sorun ordan kaynaklı olabilir.
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

verdiğim linkteki dosyayı incelediniz mi?
o örnekte 1 tablo, 1 database, 1 transaction, 1 dataaccess var yine de commitretaining çalışmıyor :(
mero
Üye
Mesajlar: 109
Kayıt: 04 Mar 2005 04:54

Mesaj gönderen mero »

S.A
Senin programı açıp denedim button1 e basınca ikinci exe de güncelleme yapıyor.
Tabi ilk kayıt girdikten sonra bastığımda çalışmadı. çalışmama sebebide table append moddayken yani indicator yıldız(*) iken commitretaining çalışmıyor. ikinci basmamda çalıştı.
Ama kaydı girip bir üst kayde geçtikten sonra buttona basınca çalışıyor.



İnşallah Heybeni çakıl taşları ile doldurabiliyorsundur. :)
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

Allah allah, çok enteresan bi durum. Bende hiç öyle olmuyor.
Sizden bir ricam var. Aşağıdaki linkteki videoyu izlerseniz ızdırabımı anlarsınız.

http://www.konat.net/neden.rar
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

arkadaşım yanlış anlaşılma var. video yu izledim. event olayı kısaca
tabloya yapılan

Yeni kayıt Insert
Kayıt Güncelle Update
Kayıt sil Delete

durumlarından birini yakalamak maksatlıdır.

senin video daki kodlarda

Kod: Tümünü seç

if eventname = 'yeni_kayıt' then
transaction.commitretaining;
şeklinde bir kod vardı.

burdaki kod bloğu

Kod: Tümünü seç

if eventname = 'Yeni_Kayıt' then
showmessage('A Tablosuna Yeni Bir Kayıt Girildi');
şeklinde olmalıdır.

peki bunu eventalerter olayında yakalamk için ise

1- EventAlerter.Registered := True;
2- İlgili Tablo Commit veya CommitRetaining yapılmalıdır.
Cevapla