Veritabanına En iyi Servis Islemi Nelerdir?

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
hedefbusiness

Veritabanına En iyi Servis Islemi Nelerdir?

Mesaj gönderen hedefbusiness »

Firebird Veritabanı ile yazılmıs bir Muhasebe Entegrasyonunda

Servis Islemleri icin Neler onerirsiniz
Örnegin Tam bir Faturanın Kaydedilmesi sırasında Elektrikler Kesilirse Fatura icerigindeki Hareketlerin bir kısmı commit edilip digerleri edilmesse Programımızın Veri bütünlügünü korumak icin nasıl bir Algoritma izlemeliyiz Servis Programı asamasında?

Örnegin Gercek Stok degeri ve Gercek Cari Degerleri nasıl hesaplatıcaz cünkü veri bütünlügü bu elektrik kesintisi sırasında bozulmus olabilir

Onerilerinizi Bekliyorum???
Iyi calısmalar
http://www.hedefyazilim.net
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Commit işlemini her hareket için yapmayacaksın. Bir faturanın bütün hareketlerini post ettikten sonra en son aşamada commit edeceksin. Transaction mantığı budur.

Bu türden kritik uygulamalarda zaten UPS olmazsa olmaz cihazlardır.
Kullanıcı avatarı
ender_arslanturk
Kıdemli Üye
Mesajlar: 709
Kayıt: 18 Şub 2005 03:38
Konum: İstanbul

Mesaj gönderen ender_arslanturk »

Birde bu soruyu çözen kişide sizsiniz aslında :D

Nedenmi . Çünkü servis işin esas can alıcı noktasıdır. Çünkü olabilecek hataları kontrol etmek programı yazmaktan daha çok işdir. Mesela faturayı kaydet deyince örnek

1. Ft. Başlığına
2. Ft. hareketlerine
3. Stok başlığına (var ise)
4. stok hareketlerine
5. Stok depo toplarına (var ise)
6. Bağlı veritabanlarına göre tahminen 8-9 tane veri tabanını çok dikkatli yönetmek gerekir.

Ne yapmak lazım...

Öncelik ile program yazma aşamasında neleri nasıl attırıyor iseniz bunların tespiti. Ondan sonra olabilecek yanlış hatalara göre notların alınması. vb. gibi tespitler... Birde şunu herkez bilirki genelde servis veya bakım gibi programlar % 100 tamir yapmamaktadır. % 100 tamir işlemi zamanla olabilecek şeylerin eklenmesi ile çıkar...

@coderlord arkadaşın dediği gibi gerek yerel olsun gerek sunucu-istemci mimari olsun gerek ise uzak bağlantılarda olsun... Tümü ile sistemin bir UPS e ihtiyacı vardır. Veri bütünlüğünün maksimum korunması için bu şarttır. :wink:
hedefbusiness

Veritabanı icin en iyi servis

Mesaj gönderen hedefbusiness »

Fatura Hareketlerini zaten tüm hareketlerin sonunda commit ediyoruz onda problem yok

Atıyorum fatura hareketleri commit edildi tam Fatura commit edilirken elektrik kesildi
Fatura kayıtsız ama baglı tabloda stok islemleri kayıt edilmis olucakki fatura cari hesap hareketleri icinde gozukmemesine ragmen ve stok hareketlerinde gozukmemesine ragmen stok seviyesi dusurulmus olucak
Iste bu gibi durumda
Gercek stok durumunu nasıl ve hangi verileri kullanarak eski haline cevirebiliriz(SERVİS İSLEMİ ESNASINDA NASIL BI MANTIK UYGULARIZ??)
Hala Buna bi öneri alamadım kimseden?
Kullanıcı avatarı
selman
Üye
Mesajlar: 664
Kayıt: 04 Ara 2003 12:06
Konum: İzmir

Mesaj gönderen selman »

selam
valla zaten yukarıda coderlord hocmaında belirttiği gibi
Ups kullanımı yoksa fatura esnasında kesilen bir proğramda dediğiniz gibi işlemler karışabilir.yada her yaptığınız kaydı post edersiniz.adam elektrikler kesilse bile o kayıtlar trancation vasıtasıyla tutulur..Adam proğramı açtığında,roolback veya duruma göre commit işlemlerini yaparsınız..bir nevi Xp deki sistemi ger yükleme mantığı... :)
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Re: Veritabanı icin en iyi servis

Mesaj gönderen fduman »

hedefbusiness yazdı: Atıyorum fatura hareketleri commit edildi tam Fatura commit edilirken elektrik kesildi
Fatura kayıtsız ama baglı tabloda stok islemleri kayıt edilmis olucakki fatura cari hesap hareketleri icinde gozukmemesine ragmen ve stok hareketlerinde gozukmemesine ragmen stok seviyesi dusurulmus olucak
Tam commit esnasında elektrik kesilirse muhtemelen kayıt gerçekleşmeyecek ve VT yapısı bozulacaktır.

Şimdi programında faturayı commit ettikten sonra gidip cari hesapları ayarlıyorsun ve stok hareketlerini oluşturuyorsun.

Bunlarda ayrı ayrı commit yapmayacaksın.

Faturayı post ettikten sonra cari hareket ve stok hareketlerini de post edip en son işlem olarak commit etmelisin. Böyle bir toplu commit sayesinde bu tip hatalardan kurtulabilirsin. Çünkü commit gerçekleşmez ise ne faturalar VT'de yer alacaktır ne de stoktan düşülmüş olacaktır. Ancak commit edildiğinde VT'ye gerçekten yazılacaktır.
hedefbusiness

sayın coderlord

Mesaj gönderen hedefbusiness »

dediginiz Mantıklı ve zaten Benim yaptıgım olayda bu olucak buna emin olun Fakat
Olurda Bu sekilde bi problem olursa
Yani Toplu Commit olayında iken

Kaydet.click(son satırlardaToplu Commit)

1-Stokislem.commit....
----Elektrik Kesintisi-----
2-Fatura.commit

gibi bi durumda dedigim olay olucak tahmin edersenizki Milisaniyelik bir olay
Bu gibi bi olay gerceklestiginde Stok verisinin Gercek Degerini SERVİS ile hesaplatmak icin Nasıl bi mantık onerirsiniz ASIL ALMAK İSTEDİGİM ÖNERİ BU YÖNDe
Size tesekkur ederim ilgilendiginiz icin..
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Commit işlemi tamamlanmaz ise VT'ye yazılmaz. Yani yapıyı böyle kurarsanız ilişkileri düzenlemek gibi bir probleminiz olmayacak. En fazla VT bozulabilir. Bunun için de Firebird/Interbase'in GFIX aracı mevcut. Gfix ile ilgili bilgi için arama :ara yapabilirsin.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Re: sayın coderlord

Mesaj gönderen fduman »

hedefbusiness yazdı:Stok verisinin Gercek Degerini SERVİS ile hesaplatmak icin Nasıl bi mantık onerirsiniz ASIL ALMAK İSTEDİGİM ÖNERİ BU YÖNDe
Hmm. Sanırım başına böyle bir sorun geldi. Nasıl kurtulacağını düşünüyorsun. :)

Her kaydın bir önceki değerini bir tabloda saklamadıkça böyle birşey yapamazsın. En iyi ihtimalle backup tan geri dönebilirsin. Söylediğin şey transactional bir VT'de çok mantıksız. Transaction'ların icad edilme sebebi bu gibi sorunlardan kurtulmaktır çünkü.
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

Bu bahsettiğiniz sorun, 1989 yılında kullandığımız Btrieve de bile TTS adıyla yeralan transaction mekanizması sayesinde oldukça uzun zaman önce aşılmıştır. Commit sırasındaki kesintide de etkilenmezsiniz zira transaction içindeki bilgiler db üzerinde farklı bir alana yazılır sonra asıl page lere taşınır. Taşıma işlemi bitmedikçe taşındı diye işaretlenmez. Eğer uygulamanıza bir servis yazmak ihtiyacı duyuyorsanız, tasarımınız baştan yanlış demektir. Her türlü yazma işlemi mutlaka bir transaction bloğu içinde olmalıdır.

Eğer servise ihtiyacınız oldu ise size kimse genel geçer bir servis modeli öneremeyecektir. Önerenler de öylesine tahmin etmiş olacaktır. Sırf cevap yazmış olmak için yazmadığımı, bu konuda problemi olanların dikkatini çekmek için yazdığımı belirtmek isterim. Çok önemli, hatta olmazsa olmaz bir konudur.
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
hedefbusiness

SAYIN DOGAN ZORLU BEY

Mesaj gönderen hedefbusiness »

Demek istediginiz olayı anladım anlamasına ancak dediginiz gibi bi transaction blogu algoritması sizin orneklemenizle ne olur
Yani Fatura+Faturahareket tablosu var diyelim burada Transaction blogu nasıl olmalıdır sizce
Ör :-------------------
Önce ,
Fatura commit edilmeli eger edilebilirse Faturahareket commit edilsin.... gibi bi kod blogumu bi örnek verebilirseniz sevinirim....... Boylelikle Servis Programınada ihtiyacımız kalmaz ...
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

Commit ile kayıt birbirinden farklıdır. Her işlem yapılır yapılmaz kaydedilir. İşlemler bittiğinde ise commit edilir. Örneğin;

StartTransaction;
Fatura Kaydet (dikkat commit değil)
Kalemleri Kaydet
Depo Toplamlarını güncelle
Cari Tabloları yapılandır
Gerekiyorsa irsaliyesini oluştur
Ödeme planı otomatik burdan yapılıyorsa onu oluştur
End Transaction;

Şeklinde yapmalısınız. Herbir satır kendi içinde commit edilmemelidir. Bir de herhangi bir hata olduğunda, rollback etmeniz çok önemli.
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
hedefbusiness

Dogan Hocam Hep Soruyorum Kusuruma Bakmayın....

Mesaj gönderen hedefbusiness »

Dediginiz Gibi yaparsak kod blogu solemi olucak

Once Fatura.starttransaction //deyip baslıyacagız
kalem
cari
depo / islemlerini post ettirip commitmi edicez?
en sonda
fatura.endtransaction //deyip faturayı commit edicez sanırım dimi

Birde tüm bu tablolar fatura Tablosuna baglı oldugu icin fatura tablosu commit edilmesse diger veriler commit edilse bile veriler islenirmi?

Birde Rollback demissiniz ben Default action olarak Rollback kullandıgımdan herhangi bi sekilde commit edilmedigi sürece zaten yazım islemi olmuyor...
Dogan bey cevaplarınız benim icin cok degerli bekliyorum....
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

Tablolarınızın Transaction nesnesi aynı ise bu söylediğiniz şey doğrudur. Herbir tablo için ayrı transaction nesnesi kullanırsanız olmaz. Bu nedenle bir arada işlem görecek tabloların transaction nesneleri aynı olmalıdır.

Rollback için şöyle düşünün;

Bir fatura kaydediyordunuz bir kontrolde birşeyin hatalı olduğunu gördünüz ve kullanıcıya bir mesaj verip geri döndünüz. Kullanıcı vazgeçip yenisini girmeye çalıştı. Transaction hala açık ve rollback edilmemiş olduğundan bu kez eğer commit e kadar giderseniz, bir önceki faturada geri döndüğünüz yere kadar db ye yazılanlar da commit edilecektir.
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Mrb, yani şekil şunu benzer olacak;

Kod: Tümünü seç

 try
 StartTransaction;
  VeriKaydetme1;
  VeriKaydetme2;
 Commit; 
except
  Rollback;
end;
iyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Cevapla