Merhabalar,
Fibplus database bilşenleri kullanıyorum.
Aşağıdaki kodlarda görüldüğü gibi önce transaction başlatıyorum. Sonra table1 e kayıt, sonra hatalı satır(kontrol için), daha sonra da table2 ye kayıt. İşlemlerden sonra da commit satırı.
Hata durumunda da rollback komutu var.
Normal şartlarda hata oluşunca table1 e yapılan kaydı geri alması gerekirken neden table1 deki kayıt yerinde duruyor.
Table1 ve Table2 nin Autocommit özellikleri True. Sebep acaba bu mu?
try
YazTr.StartTransaction;
...........
table1 e kayıt
SysUtils.Abort; // deneme amaçlı hata
table2 e kayıt
...........
Form1.YazTr.Commit;// Verileri Veritabanına yazıyoruz
except
Form1.YazTr.Rollback;
SHOWMESSAGE('BİR HATA OLUŞTU');
end;
Transaction Rollback yapmıyor.
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: Transaction Rollback yapmıyor.
RollBack'ten sonra Tablo/Query/DataSet'leri kapatıp açmalısınız! Görünen bilgiler sadece ekrana/monitöre yansıyan bilgilerdir. Veri tabanı ile okuduğu anda birebir aynı olan bu bilgiler aradan zaman geçtikçe başka bir kullanıcı tarafından bile değiştirilmiş olabilirler.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Re: Transaction Rollback yapmıyor.
Problem şu şekilde çözüldü: Bütün datasetlerimi aotucommit=true yapmıştım. Bu özelliği kaldırınca commit ve rollback lar doğru çalıştı. Bir de daha önce okuma için ayrı yazma-değiştirme-silme için ayrı transaction kullanıyordum. Şu anda her iki durumu da tek transaction yaptım. Tek transaction olmasının bir sakıncası var mı? bilmiyorum. İlginize teşekkürler rsimsek.
Re: Transaction Rollback yapmıyor.
Aynı form üzerinde birden fazla tablo da olsa tek bir transaction kullanmak mantıklıdır. Çünkü orada o an yapılanlar oradakileri ilgilendirir. post/commit edinceye kadar diğer formlardaki bilgiler birbirlerini ilgilendirmez, zaten göremez de.. Fakat yeri geldiğinde birbirlerinden haberleri olsun denirse datamodule eklenen ortak bir transactionla hepsi yapılandan haberdar olur ve anında formlara yansır. Diğer türlü ise bir yerde bir transactionla yapılan bir değişiklik diğer formlara yansıması için ib_event ve trigger sistemini kurmak lazım.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!