search
Giriş
Merhabalar arkadaşlar, Sitemizi programlama ile ilgilenen bütün arkadaşlarımızın Türkçe içerik konusunda çektiği sıkıntılar düşünülerek soru/cevap şeklinde bir etkileşimde bulunabilmesi için kurduk. Umuyoruz hepimiz için güzel bir deneyim olur. Hasscript Ekibi
0 oy
229 gösterim
Veri tabanında Member diye bir tablom var. Bunun id=5 olan kaydın "salary" column un ="100" değerinde.

Dışarıdan iki farklı kişi aynı anda bu veriye erişip güncellemeye çalışyor. Birin yaptığı değişiklği diğeri görmeden ezebilir. Bu durumda nasıl bir çözüm üretebiliriz?
Veri Tabanı kategorisinde 2.0k puan

1 cevap

1 oy

Sorunun çok bilinen bir cevabı var. Bir kaydı güncelleme yaparken kilitlemek (locking) bunun bilinen çözümü.

Yani kaydı Oracle kullanırken sorgu ile çekip arkasına "for update" yaparsan kaydı kitlemiş olursun. Bu yaklaşım db üzerinden otomatik desteklenen bir yaklaşım oluyor ve buna pesimistic locking deniyor. Bunun pesimistic olan kısmı şöyle oluyor. Eğer bu for update işini tek bir kayıt için değil de yanlışlıkla bütün tablo için atarsan tabloyu kilitlemiş olursun ki insanlar okuyamaz bile. Ayrıca commit/rollback yapmadığın sürece bu kayıt kitli kalır. DB session düşene kadar kaydı kapalı tutarsın.

Diğer yaklaşımın adı optimistic locking. Bu yaklaşımda da  tablona bir kolon daha eklersin, ismi genelde version olur. Her update işleminde bu kaydı bir arttırırsın.

update members m 
   set name = 'kenan',
       version = version + 1
 where id = :id 
   and version = :version

Bu yapıda dışarıdan id = 5 geçerken ayrıca member version bilgisini de alırsın onu da parametre olarak geçersin. Birisi o arada versiyonu artırdıysa misal sen select attığında 3 idi update ederken 4 o zaman zaten where koşuluna uymadığı için update edebileceği bir kayıt bulamayacak. Update işleminin sonucuna bakacaksın kaç kayıt update edilmiş diye (%rowcount) eğer 1 ise sıkıntı yok.

Optimistic locking desteğini hibernate de verir. @Version diye bir annotation vardı yanlış hatırlamıyorsam.

6.2k puan
LOCK TABLE table_name IN SHARE MODE NOWAIT;

tabloyu locklama yöntemi de gördüm. Oracle da en azından. Ancak hiç kullanımına denk gelmemiştim :)

https://www.techonthenet.com/oracle/transactions/lock_table.php

İlgili sorular

0 oy
1 cevap 403 gösterim
403 gösterim
Selam, Oracle'da pl/sql ile bir miktar data içeri alacağım. Yalnız atacağım tablo üzerinde trigger var. Sistem kayıt eklendiği tarihi atıyor mesela. Benim session açtığım sırada insert date çalışmasını istemiyorum. Yani session başladığında trigger benim içeri alacağım datalar için kapalı olsun. Normal sistemin çalışmasını etkilemesin.
1 Ekim 2018 Veri Tabanı kategorisinde tolgacelik.art 2.0k puan sordu
1 oy
1 cevap 263 gösterim
263 gösterim
Selam, elimizde çok büyük bir tablo var. Bunun içinden sadece belirlediğim koşullardaki verileri çekeceğim. Ancak create table as .. şeklinde tablo oluşturmadan boyutunu select sonucumun boyutunu öğrenebilmemin bir yolu var mıdır?
28 Mayıs 2018 Veri Tabanı kategorisinde tolgacelik.art 2.0k puan sordu
0 oy
1 cevap 385 gösterim
385 gösterim
Oracle veri tabanında bazı tabloların PrimaryKey'leri ve bununla bağlantılı ForegeinKey'leriin disabled olduğunu gördüm. listesini çekmeye çalıştım şu query ile; select * from user_constraints t where t.status <> 'ENABLED' and t.CONSTRAINT_TYPE = 'R'; ancak tek ... disabled-invalid gözüküyor. Bir hata almıştım şöyle ORA-02270: bu sütun listesine karşılık gelen bnezersiz veya birincil anahtar yok"
30 Nisan 2018 Veri Tabanı kategorisinde tolgacelik.art 2.0k puan sordu
0 oy
1 cevap 205 gösterim
205 gösterim
Veri tabanında bazı objeleri unsusable yaptım. Bunların bir listesini çekebileceğim sorgu var mı bilindik?
30 Nisan 2018 Veri Tabanı kategorisinde tolgacelik.art 2.0k puan sordu
0 oy
1 cevap 633 gösterim
633 gösterim
Oracle veri tabanımdaki bazı tablolardaki dataları dump olarak almak istiyorum. Nasıl bir yol izlenebilir? SQL komutları veya .bat çalıştırmak kullanabiliriz sanırım. Bu belli standart ve komutları varsa paylaşabilir misiniz?
16 Kasım 2017 Veri Tabanı kategorisinde tolgacelik.art 2.0k puan sordu