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;
Kayit kilitleme ve kontrolunu SP yapabilirmiyim
-
- Üye
- Mesajlar: 143
- Kayıt: 15 Haz 2003 08:33
- Konum: Almaty, Kazakhstan
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
gibi....
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
-
- Üye
- Mesajlar: 143
- Kayıt: 15 Haz 2003 08:33
- Konum: Almaty, Kazakhstan
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
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
- buraksandikci
- Üye
- Mesajlar: 9
- Kayıt: 24 Ağu 2004 12:31
- Konum: İzmir/Bornova - Balıkesir
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?

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
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.
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
- buraksandikci
- Üye
- Mesajlar: 9
- Kayıt: 24 Ağu 2004 12:31
- Konum: İzmir/Bornova - Balıkesir