Merhaba,

Çok kullanıcılı sistemlerde bir kayıt üzerinde iki kullanıcının işlem yapmasını nasıl engeleyebilirim veya aynı kayıt yapılmasını nasıl engellerim?

örneğin x kullanıcısı 1 nolu kayıtı okuduğunu anda diğer yeni kullanıcılar o kayıda erişim engelini koyulabilir mi?

veya

1 nolu kayıta girip alt kayıtlar eklenecek alt kayıtlar tekil birimi ancak üç alana göre tutmam lazım

x     y     z    
1     1     1
1     1     1----->bu kayıdın olmaması gerekmektedir
1     1     2-----> böyle bir kayıdın olması mümkündür

Umarım anlatabilmişimdir

Şimdiden yardımlarınız için teşekkürler

soruldu: 03 Şub '15, 08:09

kurtomerfaruk's gravatar image

kurtomerfaruk
1.3k222940
cevap kabul oranı: 30%

değiştirildi: 04 Şub '15, 03:46

SaRPaRDa's gravatar image

SaRPaRDa
5.0k213165


Bir kullanıcının okuduğu satırı kilitleyebileceğin gibi satıra version numarası vererekte data bütünlüğünü koruyabilirsin. Ben versiyon kullanmayı tercih ediyorum. Her iki çözüm için de link-1 link-2

permanent link

cevaplandı: 03 Şub '15, 08:19

SaRPaRDa's gravatar image

SaRPaRDa
5.0k213165
cevap kabul oranı: 27%

@SaRPaRDa cevabın için teşekkürler ama bir türlü oturtamadım kafamda

(03 Şub '15, 09:48) kurtomerfaruk kurtomerfaruk's gravatar image
1

Mantık şu:

Veritabanındaki her satırda "version" isimli DateTime veya long tipinde bir kolon olacak. long tipi üzerinden gidecek olursak;

1 nolu kaydı eklediğinde version kolonunun değeri 1 olacak. Satır üzerinde herhangi bir değişiklik yapıldığında version numarası 1'er 1'er artacak.

Veri değiştirilmek üzere alındığında versiyon numarasıda okunacak. Değişiklikler yapıldığında where alanına version numarasını da ekleyeceksinki başka bir kullanıcı değiştirdi ise onun yaptığı değişiklikler ezilmesin.

Update tablom set alan2=3, version=3 where Id=1 and version=2;

Veritabanı geriye değiştirilen satır sayısını gönderir. Değiştirilen satır sayısı sıfır ise, sen datayı okuduktan sonra başka birisi değişiklik yapmış demektir.

(03 Şub '15, 10:00) SaRPaRDa SaRPaRDa's gravatar image

Teşekkürler @SaRPaRDa yardımların için olumlu sonuç aldım sayende

(04 Şub '15, 03:10) kurtomerfaruk kurtomerfaruk's gravatar image

Rica ederim.

(04 Şub '15, 03:23) SaRPaRDa SaRPaRDa's gravatar image

Kayıt işlemi bu şekilde engelleniyor fakat uzun bir işlem olduğunu düşünürsek muhasebe de fiş girişleri birden fazla kullanıcı aynı şeyleri girme yerine kayıdı kilitlemek daha elverişli olacağını düşünüyorum da bunu nasıl yapabilirim?

(04 Şub '15, 03:32) kurtomerfaruk kurtomerfaruk's gravatar image

Şöyle söyleyeyim, versiyonlamaya optimistic, satır kilitlemeye pessimistic lock diyorlar. Pessimistic lock cevapta verdiğim link-1'de ve burada anlatılmış.

(04 Şub '15, 03:44) SaRPaRDa SaRPaRDa's gravatar image
1

eğer pessimistic lock yaparsanız, işlem uzun sürüyor ve yüksek miktarda istek gelirse kanımca Thread'ler beklemeye birikmeye başlayacak sonrası ise uygulamanın down olması demek oluyor. optimistic lock iyidir ;)

(04 Şub '15, 13:19) Turgay Can Turgay%20Can's gravatar image

@SaRPaRDa,@J2EE yardımlarınız için teşekkürler zaten pessimistici bir türlü başaramadım :)

(05 Şub '15, 02:31) kurtomerfaruk kurtomerfaruk's gravatar image
8 yorumdan 5 tanesi gösteriliyor hepsini göster

Arkadaşlar VT den conteyner ın aldığı istekleri aynı anda diğer sessionlar kontrol edemediği için kesin çözüm; SELECT * FROM TABLE_NAME WHERE CONDITION= ? FOR UPDATE NOWAIT şeklinde ilgili kaydı locklamak olacaktır. Lockladıktan sonra ilgi kayıt üzerinde istenilen tüm işlemler yapılır. Commit verilince kayıt serbest bırakılır.

permanent link

cevaplandı: 10 Şub '15, 01:46

ariferol's gravatar image

ariferol
1011
cevap kabul oranı: 33%

Datatable da nasıl yapılacak peki o durum ben her bir kayıt çekmek için bir get yapmıyorum Selected ile çekip okuyorum ?

(10 Şub '15, 10:21) kurtomerfaruk kurtomerfaruk's gravatar image

Data Table dan kastınız, kullandığınız veri tabanı tablosu ise, mantık olarak üzerinde işlem yapacağınız kayıt kümesini yukarıdaki script ile önce lock lıyorsunuz. sizin işiniz bitinceye kadar bu kayıt kümesine hiç bir session müdahale edemiyor, sadece okuyabiliyor. Siz işlemlerinizi bitirdikten sonra diğer sessionlar kayıtlar üzerinde işlem yapabiliyorlar. Bu arada "SaRPaRDa" nickli arkadaş, yukarıdaki lock lama işleminin hibernate ile yapılışını yazmış, yeni farkettim. Hibernate kullanmıyorsanız, benim yazdığım script ile kayıt veya kayıt kümesini locklayıp üzerinde işlem yapmanız gerekir.

(10 Şub '15, 16:38) ariferol ariferol'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:

×109
×1

Soruldu: 03 Şub '15, 08:09

Görüntüleme: 596 kez

Son güncelleme: 11 Şub '15, 03:21

powered by BitNami OSQA