Merhaba, İlişkili 5 tabloya veri ekliyorum. Öncelikle ilk tablom olan sipariş tablosundaki siparis no alanındaki sayıyı bir arttırıp yeni sipariş numarası olarak alıyorum. Ardından bu sipariş numarasını kullanarak diğer tablolara veri ekliyorum. İşlem bir transaction içinde gerçekleşiyor ve hata yoksa commit ediyorum. Son sipariş numarasını almak için kullandığın SQL cümlesi şöyle;

SELECT MAX(SiparisNo) + 1 FROM Siparisler

Ancak peş peşe gelen kayıt işlemlerinde sistem aynı numarayı veriyor ve hata oluyor. Bunun önüne nasıl geçebilirim?

soruldu: 24 Kas '14, 06:41

zafer's gravatar image

zafer
41591019
cevap kabul oranı: 11%

değiştirildi: 24 Kas '14, 06:42

veritabanı ile ilgili bağlantıyı her seferinde kapatıp açarsan sorun düzelir sanırım.

(24 Kas '14, 07:14) zidan650 zidan650's gravatar image

auto increment kullanmamak için bir sebep mi var? Bu sebeple mi id yi kendin oluşturuyorsun?

(24 Kas '14, 07:29) Önder %C3%96nder's gravatar image

Mevcut bir program için sipariş aktarım programı geliştirmeye çalışıyorum. Mevcut sipariş no alanı otomatik artan bir alan degil ve ona müdahale edemem.

Her seferinde kendi sipariş numaramı oluşturup gönderiyorum. Ancak işlemler peş peşe olunca ilk aldığım numaranın işlemi tamamlanmadan başka bir işlem başlayıp aynı numarayı alınca işler karışıyor.

(24 Kas '14, 07:46) zafer zafer's gravatar image

thread safe yapmalısınız.

metodu syncronized yapmanız yeterli olacaktır. yada bir queue içindede yaparsanız olur.

(24 Kas '14, 07:58) Turgay Can Turgay%20Can's gravatar image

J2EE, aktarımı yapan tek bir program yok örneğin windows application aktarım yaparken web servisler üzerindende sisteme aktarımlar yapılabiliyor.

Dolayısıyla kendi içlerinde verileri kuyruklamak çözüm olmuyor bağlamlar (content) farklı ve bir birinden bağımsızlar. Bu arada proje C# ile geliştiriliyor.

(24 Kas '14, 08:08) zafer zafer's gravatar image

O zaman clientlara gore id üretiniz. A servisinden bir istek geliyorsa, A_Service_UUID şeklinde, böylelikle her servisden gelen sipariş id'leri kendi içinde tutarlı olur. Genel olarakda UUID ler aynı olsa dahi servis isimleri farklı olduğu için unique bir id elde etmiş olursunuz.

(24 Kas '14, 08:41) Turgay Can Turgay%20Can's gravatar image

Sorun istemcilerde değil, onların sipariş eklerken sistemden talep ettikleri numarada, Yani A,B,C servis veya programları birbirinden bağımsiz ve her sipariş ekleme esnasında sistemden yeni bir sipariş numarası almak zorundalar.

A en son numarayı aldı işleme başladı, bu esnada B yeni bir numara istiyor ve o da aynı numarayı alıyor. Çünkü A ve B birbirinden habersiz ve ikiside veritabanındaki en büyük numarayı almak durumundalar.

(24 Kas '14, 10:01) zafer zafer's gravatar image

tmm bende aynı şeyi söylüyorum. database'den id yi ver ama servise sunucudan donerken, başına geldiği yere ekle diyorum bende.

A, B , C Servisleri senın sunucundaki db'den kayıt no alcak, aynı saniyede girsin bu 3 transaction'da, servislere donerken uygulama katmanında, servis adını ekle oyle bir id servise dön diyorum yada db'den sequence nosunu al, service katmanında servis adını ekle..

A_DBDENGELENDEGER , B_DBDENGELENDEGER gibi..

(24 Kas '14, 10:31) Turgay Can Turgay%20Can's gravatar image

Yeni bir tablo veya trigger oluşturabiliyor musun? Stored procedure?

(24 Kas '14, 11:09) Dkyc Dkyc's gravatar image

J2EE, veritabanıdaki alan id degil sayısal bir alan. A ve B veritabanından 25 değerini aldı diyelim. O zaman A_25, B_25 olacak, sistem bunları bir arttırıp yeni sipariş no oluşacak. A_26, B_26 şimdi bunları veritabanına yeni sipariş olarak eklemek istersek nasıl olacak? İkiside aynı sipariş numarasını aldı?

Dkyc, ana programın tablo yapısına dokunamam ama yeni bir tablo yada saklı yordam (stored procedure) ekleyebilirim.

(25 Kas '14, 01:46) zafer zafer's gravatar image

Aldıgın id'yi ayni veritabanına/tabloya yazmayacaksın.

İlla sayısal ifade olması şartsada ve order number'ın id olması oldukça yersiz, 100 ile başlayan standart sayılar kullanırsın.

A = 100, Sipariş ID : 123123123 , 100123123123

Neyse kolay gelsin :)

(25 Kas '14, 02:26) Turgay Can Turgay%20Can's gravatar image

J2EE, getirdiğin farklı bakış açısı ve verdiğin bilgiler için teşekkürler. Ancak yukarıdada belirttigim gibi mevcut bir sistem ile çalışıyorum ve beğenmesemde o sistemin kurallarına uymak durumundayım.

Sipariş numarası 1'den başlayıp sıra ile artan bir sayı olmalı başına sonuna bir şeyler eklemek yada sırayı değiştirme veya bir şeylerle çarpmak bölmem gibi bir durumum yok. Fatih'in çözümü üzerine yoğunlaştım. Sipariş numarasını dışarı almaya çalışıyorum.

Neyse teşekkürler ;)

(25 Kas '14, 02:49) zafer zafer's gravatar image
12 yorumdan 5 tanesi gösteriliyor hepsini göster

Günü kurtarmak için aşağıdaki şekilde kullanabilirsin. En kısa zamanda auto increment kullanmaya bak
begin TRANSACTION

declare @SiparisNo int;
SELECT @SiparisNo= MAX(SiparisNo) + 1 FROM Siparisler;
insert into Siparisler set (SiparisNo) values(@SiparisNo);

COMMIT TRANSACTION

permanent link

cevaplandı: 24 Kas '14, 09:13

Fatih%20A%C5%9Flamac%C4%B1's gravatar image

Fatih Aşlamacı
1.0k111929
cevap kabul oranı: 14%

Fatih bunu anlamadım. İşlam zaten bir transaction içinde gerçekleşiyor. Bunun yaptığımda değişen ne olacak?

(24 Kas '14, 09:55) zafer zafer's gravatar image

transaction içersinde hem max değerini alıp hemde max değerini tekrar tabloya yazıyoruz. max ve insert ard arda çalışıyor. değişen şeyin ne olduğunu söyleyebilmem için senin kullandığın transaction yapısını görmem lazım.

(24 Kas '14, 10:00) Fatih Aşlamacı Fatih%20A%C5%9Flamac%C4%B1's gravatar image

Anladığım kadarıyla ekleme işleminden hemen önce sipariş numarasını alıp aradaki süreyi en aza indirmeye çalışıyorsun. Böylece araya başka işlemlerin girme olasılığı en aza iniyor.

Ancak ilişkili tablolarla çalışıyorum ve bu sipariş numarasını diğer tablolarada eklemem gerek. Sipariş numarasını uygulama tarafına nasıl alabilirim?

(25 Kas '14, 01:53) zafer zafer's gravatar image

sadece süreyi kısaltmıyorum. transaction içinde olduğu için başka hiç kimse o sırada insert işlemi yapamaz. gönderdiğim örnekte siperişler tablosuna insert yaptım. hemen arkasından başka bir tabloya insert yapabilirsin. örnek
insert into SiparisDetay set (SiparisNo,Aciklama) values(@SiparisNo,'1 kilo elma')
yada Siparisler tablosuna insert yaptıktan hemen sonra
select @SiparisNo as SiparisNo
dersen uygulama tarafından sipariş noya ulaşabilirsin.

(25 Kas '14, 03:45) Fatih Aşlamacı Fatih%20A%C5%9Flamac%C4%B1's gravatar image

Teşekkürler.

(28 Kas '14, 01:28) zafer zafer's gravatar image

Sipariş noyu oluştururken amaç sadece benzersiz sayı üretmekse sayıyı veritabanında üretmek/kontrol etmek yerine sipariş noyu dışardan rastgele sayılar gönderseniz nasıl olur? Örneğin bunu Java'da yapıyorsanız; veritabanına sipariş eklerken System.nanoTime() veya System.currentTimeMillis() gibi bir fonksiyonuyla yapabilirsiniz. Daha da güvenli hâle getirmek için bu sayılara ek benzer bilgiler eklenebilir(Kullanıcı IP adresi, MAC adresi, Üye numarası vs.), bu kısım size ve veritabanındaki veri tipinin hoşgörüsüne kalmış. Alternatif olarak Thread Safe olması için Java'daki "synchronized" gibi yapılar kullanabilirsiniz ama bunu tamamen geliştirme yaptığınız platformları bilmeden yazıyorum. Bana göre her türlü bu tür bir yapı kullanmalısınız. Aynı anda veritabanında sadece bir işlem yapılması her zaman iyidir güvenlik açısından. Umarım yardımcı olur.

permanent link

cevaplandı: 24 Kas '14, 11:40

AliGungor's gravatar image

AliGungor
22616
cevap kabul oranı: 10%

Ali, ilgin için teşekkürler. Mevcut bir sisteme entegrasyon yaptığım için o sistemin kurallarına uymak zorundayım. Yoksa elbette çok daha güzel tasarımlar ve teknikler kullanılabilir.

(25 Kas '14, 01:55) zafer zafer's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1

Soruldu: 24 Kas '14, 06:41

Görüntüleme: 825 kez

Son güncelleme: 28 Kas '14, 01:28

Benzer sorular

powered by BitNami OSQA