Kayit kilitleme ve kontrolunu SP yapabilirmiyim

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

Kayit kilitleme ve kontrolunu SP yapabilirmiyim

Mesaj gönderen Burhan_ast »

Arkadaslar merhaba,

Asagidaki gibi bir fonksiyonum var bu fonksiyon yardimi ile tablomda lock isimli alana isaret koymak sureti ile kayiti kilitliyorum veya kilitli ise kullaniciyi uyariyorum, ve bu fonksiyonu tum tablolarda kullaniyorum,

1 - Bu fonksiyonu Stored Procedure cevirebilirmiyim (Nasil),
2 - Sizce bu calisma sekli ne derece mantiklidir, ve cok fazla kullanici sayisinda problem yasarmiyim,

Sistem
D7
Ado ile baglaniyorum
MS-Sql Server 2000

Function TFrm_Ana_form.Kilit_kotrolu(Sender : TObject; Tablo, Kayit_no, Islem_tipi : String) : boolean;
begin

Tbl_Isaret.SQL.Clear;
Tbl_Isaret.SQL.Add('Set dateFormat '+Frm_ana_form.Sql_Tarih_formati);
Tbl_Isaret.SQL.Add('Select Kayit_no, Lock');
Tbl_Isaret.SQL.Add('From '+Tablo);
Tbl_Isaret.SQL.Add('Where Kayit_no = '+Kayit_no);
Tbl_Isaret.ExecSql;
Tbl_Isaret.Open;

// Kilit kaldiriliyor...
If Islem_tipi = '-' then
Begin
Tbl_Isaret.Edit;
Tbl_Isaret.Fieldbyname('Lock').text:='0';
Tbl_Isaret.Post;
End;

// Kayita kilit konuluyor....
If Islem_tipi = '+' then
Begin
If Tbl_Isaret.Fieldbyname('Lock').Text<>'0' then
begin
// Kayit baska kullanici tarafindan kullaniliyor
Frm_Ser_Kayit_kilitli := TFrm_Ser_Kayit_kilitli.Create (Self);
Frm_Ser_Kayit_kilitli.Islem_durumu(Sender, 'B', Tablo, Kayit_no);
Frm_Ser_Kayit_kilitli.Showmodal;
Frm_Ser_Kayit_kilitli.Free;
Result:=True;
End Else
begin
Tbl_Isaret.Edit;
// Lock alanina aktif kullanicinin nosu konularak
// hangi kullanicinin kayiti kullandigi tespit edilebiliniyor...
Tbl_Isaret.Fieldbyname('Lock').text:=Kullanici_kayit_no;
Tbl_Isaret.Post;
Result:=False;
End;
End;
Tbl_Isaret.Close;
End;
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Oncelikle delphi tarafindan bir kayıt kilitlemeye neden ihtiyac duydugunuzu merak ediyorum. Cunku veritabanı dısında bir arac uzerinden bu tur isleri manuel yapmayı cok dogru bulmuyorum. Ki siz de zaten bu isleri sizin adınıza yapan ya da yapabilecek bir veritabanı kullanıyorsunuz. MS SQL Server kullanırken buna neden ihtiyac duydunuz ki? Bu sorunun cevabına gore belki de baska bir sey soylemeye gerek kalmayabilir.

Fakat bu isi SP (Stored POrocedure) yapma konusundan pek emin degilim. Sundan dolayi sanırım siz bir kayıt ustunde edit islemi yapinca kaydi kilitliyorsunuz. Muhtemelen post islemi sonrasında da kilidi kaldiriyorsunuz. Delphi tarafindaki edit islemi bir event olmasına ragmen bunun veritabanı tarafında bir karsılıgı yoktur. Yani ilgili tablo veritabanı tarafindan kilitlenir ve mesela table uzerinde bir alter işlemi filan yapamazsınız ama bildigim kadarı ile bir kayıt kilitleme olmaz. Ancak post islemi sırasinda bir update kodu gonderilir ve veritabanı tarafında bir event olusur. Dolayisiyla benim bilgim dahilinde delphi tarafindaki before edit'in veritabanına bir yansıması olmaz.

Lakin eger derseniz ki ben before edit aninda en azindan yazilmis bir SP'u cagirayim bari. En azindan daha hızlı calisan bir kod olsun. O zaman bu kodu gayet kolay bir sekilde bir SP olarak yazip istediginiz anda da cagirabilirsiniz...
Ornek kayit kilitleme

Kod: Tümünü seç

create procedure SP_KAYIT_KILITLE(@KAYIT_NO integer) as
begin
  update TABLO
  set LOCK=1
  where KAYIT_NO=@KAYIT_NO
end
gibi....
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

Mesaj gönderen Burhan_ast »

Merhaba Fahrettin bey,

Oncelikle delphi tarafindan bir kayıt kilitlemeye neden ihtiyac duydugunuzu merak ediyorum. Cunku veritabanı dısında bir arac uzerinden bu tur isleri manuel yapmayı cok dogru bulmuyorum. Ki siz de zaten bu isleri sizin adınıza yapan ya da yapabilecek bir veritabanı kullanıyorsunuz. MS SQL Server kullanırken buna neden ihtiyac duydunuz ki? Bu sorunun cevabına gore belki de baska bir sey soylemeye gerek kalmayabilir.

Demissiniz ama malesef ben Ms-Sql server'rin kayiti nasil kitledigi, yani kayiti ben delphide Tbl_stok.Edit; deyince kitliyormu otomatik yoksa kod yazmammi gerek ayrica, kilitli kayitin kilitli oldugunu nasil anlarim ve hangi kullanici tarafindan kilitlendigi hususunu bilmedigim icin ve bu konuda bir kaynak bulamadigim icin belirttigim gibi bir yontem gelistirdim kendime gore, Eger nasil yapacagim hususunda bilgi verirseniz memnun olurum,

Burhan Cakmak
Kullanıcı avatarı
buraksandikci
Üye
Mesajlar: 9
Kayıt: 24 Ağu 2004 12:31
Konum: İzmir/Bornova - Balıkesir

Mesaj gönderen buraksandikci »

bir yıldır buraya bir şey sorulmamış ben Sorayım dedim :) bu kayıt kilitleme işini firebird de nasıl yapabiliriz .. yukarıdaki verilen örnekte"LOCK" bir field adımıdır? procedure işimi görürümü acaba??
başka teknikler varmı yada fire bird de kayıt bazlı kilitleme yokmu acaba?
Madem TÜRK'sün Kullan gücünü tüm dünya görsün
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

oncelikle firebird de istege baglı olarak kayıt bazlı kilitleme yapılabilir.
yani kilitleme dedigimiz siz bir satır uzerinde islem yaparken baskaları aynı kayıt uzerinde update yada delete yapamamaktadır.
ama diger satırlar uzerinde calısmaya devam edebilmektedirler.
bir fikir vermesi acısından
viewtopic.php?t=3769&highlight=firebird ... ransaction
adresindeki konuyu okuyun.
ornekler uzerinde nasıl yaptıgımı anlatayım
tablo isimli id, alan1 alanlarına sahip bir tablomuz olsun
id alan1
1 deneme1
2 deneme2
3 deneme3

tablodaki kayıtlarda bunlar olsun

kilitleyip uzerinde islem yapmak(update yada delete) istediginiz kayıt
2 id li kayıt olsun.

sql=select * from tablo where id=1 for update with lock

bu yazdıgınız sql i updatesql ile kullandıgınızı varsayın. (ibexpertte sorunsuz calısıyor.)
sonra update/delete islemini yapın.

bu sırada aynı kayıt uzerinde degisiklik yapmaya calısanlar "lock conflict" hatası alacaklar
ta ki siz kayıtı kilitleyen transaction ı kapatana kadar.
ya islemi onaylar commit edersiniz yada onaylamayıp roolback edersiniz.

olay bundan ibaret
biraz makalemsi oldu ama acıklayıcı olmustur kanatimce.
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
buraksandikci
Üye
Mesajlar: 9
Kayıt: 24 Ağu 2004 12:31
Konum: İzmir/Bornova - Balıkesir

Mesaj gönderen buraksandikci »

hocam çok sağolun daha öncede bu konuyla ilgili bi kaç sorum olmuştu tatmin edici cevaplar alamamıştım.. Allah Razı olsun çok teşekkür ederim.
Madem TÜRK'sün Kullan gücünü tüm dünya görsün
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

rica ederim
bende unutmadan daha once arastırıp ogrendigim bir seyi forum database ine aktarmıs oldum
yoksa gun gelir nasıl yapılıyor du diye bende bi soru atardım :)
ÜŞENME,ERTELEME,VAZGEÇME
Cevapla