Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

ADO komponente - pesimistično zaključavanje na SQL serveru 2005

[es] :: C/C++ programiranje :: ADO komponente - pesimistično zaključavanje na SQL serveru 2005

[ Pregleda: 3563 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon ADO komponente - pesimistično zaključavanje na SQL serveru 200523.04.2008. u 11:41 - pre 172 meseci
U Sql serveru 2005 sam napravio bazu i preko ado komponenti namjestio server-cursor te pessimistic lock i keyset cursor-type. Koristim TDBGrid i problem je da se zaključavanje vrši za cijelu tablicu čim podatke vidim u gridu. Meni treba da se zaključavaju samo oni zapisi koji se trenutno editiraju. I sad... kako to namjestiti... tj. da se zaključavanje vrši na razini zapisa, a ne tablice?

EDIT:
Otkrio sam bar jedan dio rješenja, a to je da se zaključavanje svih zapisa u tablici može izbjeći tako da se uopće ne koristi DBGrid već alternativne DB komponente. No to i dalje nije dobro rješenje jer se zaključavanje zapisa vrši automatski čim taj zapis pogledam, a meni treba da je to samo u slučaju editiranja..

[Ovu poruku je menjao itf dana 23.04.2008. u 12:55 GMT+1]
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: ADO komponente - pesimistično zaključavanje na SQL serveru 200523.04.2008. u 12:29 - pre 172 meseci
Citat:
@itf
Otkrio sam bar jedan dio rješenja, a to je da se zaključavanje svih zapisa u tablici može izbjeći tako da se uopće ne koristi DBGrid već alternativne DB komponente

Zasto bi koristio lock-ing na nivou komponente kad mozes i na samo SQL serveru
Probaj sa ROWLOCK hint-om :
Code:

BEGIN TRAN 
UPDATE table WITH (ROWLOCK) SET column = x WHERE uslov = x 
COMMIT TRAN

Medjutim nije ni ovo najsrecnije resenje jer ima i zamki :
http://www.developerfusion.co.uk/show/1688/4/




[Ovu poruku je menjao deerbeer dana 23.04.2008. u 14:00 GMT+1]
Viva lollapalooza
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: ADO komponente - pesimistično zaključavanje na SQL serveru 200523.04.2008. u 13:44 - pre 172 meseci
Ne razumijem baš gdje to ubaciti u serveru. To je nekakav stored procedure ili? I kako dalje da se komponentom spajam? Optimistično?
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.ptt.yu.



+395 Profil

icon Re: ADO komponente - pesimistično zaključavanje na SQL serveru 200523.04.2008. u 14:07 - pre 172 meseci
Kreiraj proceduru na serveru .
Posto ne koristim Borlandove alate ne znam kako ces je pozivati ..
al valjda neka tvoja Borland DB komponenta moze da prosledi komandu ( u obliku stringa) SQL serveru ;
CommandText = "exec UpdateNekeTabele 32" (32 je parametar koji prosledjujes SQL-u)

Code:

CREATE PROC UpdateNekeTabele @primaryKey int 
AS 

BEGIN TRAN 
UPDATE table WITH (ROWLOCK) SET column = x WHERE uslov = @primaryKey 

IF @@ERROR != 0 
BEGIN 
GOTO ERRORHANDLER  
END 
COMMIT TRAN 
RETURN 

ERRORHANDLER: 
ROLLBACK TRAN 
RAISERROR ('Failed to update table .',16,1)  /* ova linija baca exception sa porukom u tvom programu 


Zamka kod koriscenja ROWLOCK je da SQL moze da ti zakljuca celu ili veci deo tabele
(ako su zapisi na istom page-u itd ..pogledaj link prethodnog posta)
I ako update-ujes vise redova u tvojoj proceduri .....
Cak i ako koristis neke eksterne DB komponente ne verujem da ce da ti zakljucavaju redove bolje od SQL jer je to samo po sebi posao SQL servera .

PS
Ova tema je mogla i da bude na MSSQL forumu jer je tamo neophodno : exec sp_skini_paucinu_sa_foruma :-)



Viva lollapalooza
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: ADO komponente - pesimistično zaključavanje na SQL serveru 200523.04.2008. u 14:38 - pre 172 meseci
Imam tablicu Osoba i njena struktura je ovakva:

ID (primary, increment)
Prezime (nvarchar(50))
Ime (nvarchar(50))
Godine (smallint)

I napravio sam ovu stored procedure:

Code:
CREATE PROC MojUpdate @primaryKey int 
AS 

BEGIN TRAN 
UPDATE Osoba WITH (ROWLOCK) SET column = ID WHERE ID = @primaryKey  /* greška u sintaksi */

IF @@ERROR != 0 
BEGIN 
GOTO ERRORHANDLER  
END 
COMMIT TRAN 
RETURN 

ERRORHANDLER: 
ROLLBACK TRAN 
RAISERROR ('Ne bi išlo....',16,1)  /* ova linija baca exception sa porukom u tvom programu */


E sada.. tu mi gore javlja grešku, pa ako možeš napisati s obzirom na strukturu gornje tablice kako točno izgleda taj stored procedure?
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.ptt.yu.



+395 Profil

icon Re: ADO komponente - pesimistično zaključavanje na SQL serveru 200523.04.2008. u 15:05 - pre 172 meseci
Citat:
@itf
UPDATE Osoba WITH (ROWLOCK) SET column = ID WHERE ID = @primaryKey /* greška u sintaksi */

Sorry ... SET 'column' sam dao primera radi jer sam mislio na konkretnu kolonu koju update-ujes

Code:

CREATE PROC MojUpdate @primaryKey int,@Ime  nvarchar(50), @Prezime nvarchar(50),@Godine int 
AS 
BEGIN TRAN 
UPDATE Osoba WITH (ROWLOCK) SET Ime = @Ime  WHERE ID = @primaryKey
IF @@ERROR != 0 
BEGIN 
GOTO ERRORHANDLER  
END 

UPDATE Osoba WITH (ROWLOCK) SET Prezime= @Prezime  WHERE ID = @primaryKey
IF @@ERROR != 0 
BEGIN 
GOTO ERRORHANDLER  
END 

UPDATE Osoba WITH (ROWLOCK) SET Godine= @Godine  WHERE ID = @primaryKey  
IF @@ERROR != 0 
BEGIN 
GOTO ERRORHANDLER  
END 

COMMIT TRAN 
RETURN 

ERRORHANDLER: 
ROLLBACK TRAN  /* ponistavas promene koje si napravio ako ti neki od update-a ne prodje 
RAISERROR ('Ne bi išlo....',16,1)  /* ova linija baca exception sa porukom u tvom programu */

U programu naravno pozivas sa "exec MojUpdate 132,'Pera','Peric',24 " 



Jedan mali savet kod dizajna tvoje tabele :
Nikad ne pravi kolonu koja se dinamicki menja (mislim na godine) jer ces svake godine morati da je azuriras .. :-)
Umesto toga napravi kolonu datum rodjenja i u svakom upitu dinamicki racunaj broj godina


Viva lollapalooza
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: ADO komponente - pesimistično zaključavanje na SQL serveru 200523.04.2008. u 15:15 - pre 172 meseci
"exec MojUpdate 132,'Pera','Peric',24 "

Čemu služe ove konstante 132 i 24?

I naravno da nije dinamičko računanje godina ;) Zapravo, mislio sam staviti Broj_cipela :) Tek toliko da imam neki drugi tip podatka osim znakovnog.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.ptt.yu.



+395 Profil

icon Re: ADO komponente - pesimistično zaključavanje na SQL serveru 200523.04.2008. u 15:24 - pre 172 meseci
exec MojUpdate 132,'Pera','Peric',24 "
Isto je primera radi jer ne mogu da znam tvoje primarne kljuceve i sta imas od podataka u bazi :-)
132 je primarni kljuc , Pera je ime , Peric prezime , a 24 su godine ..
Prosledjujes parametre onako kako si ih definisao u stored proceduri (istim redosledom) .


Viva lollapalooza
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: ADO komponente - pesimistično zaključavanje na SQL serveru 200523.04.2008. u 15:34 - pre 172 meseci
Kužim... No pitanje je kada pozivam ovu stored procedure? Prilikom izmjene dataset-a? Taj dataset mora imati stalnu konekciju zbog toga i mora imati optimistic lock?

Općenito, zanima me ta veza između stored procedure, dataset-a i na koji način da realiziram zaključavanje samo u slučaju editiranja.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.ptt.yu.



+395 Profil

icon Re: ADO komponente - pesimistično zaključavanje na SQL serveru 200523.04.2008. u 16:00 - pre 172 meseci
Proceduru pozivas kada hoces izmene napravljenu u datasetu da snimis u bazu (Submit Save to database ili tako nesto )
Tvom dataset-u ne treba stalna konekcija vec samo u trenutku snimanja i posle toga je zatvaras (ovakva implementacija se razlikuje po mnogim pitanjima )
Taj dataset ne treba da ima nikakav lock jer njega moze da edituje samo tvoja instanca programa (pretpostavljam ) ,
i verovatno taj dataset ima mogucnost ako korisnik napravi izmenu da ge vratis na prvobitno stanje (nesto npr. dataset->RejectChanges() ili tako nesto ) al to nema veze sa lock-ovanjem tabela u bazi .
Lock tabele ti je potreban samo ako tvoj program koristi vise ljudi tj. imas vise instanci programa koji edituju tvoju tabelu npr. u LAN mrezi ...
time sprecavas da vise ljudi pristupi tj. menja podatke za jednu osobu .

Viva lollapalooza
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.adsl.net.t-com.hr.



+9 Profil

icon Re: ADO komponente - pesimistično zaključavanje na SQL serveru 200523.04.2008. u 19:17 - pre 172 meseci
Ali to ne zaključava record prilikom njegova editiranja... a meni to treba.

Edit: Mislim da sam smislio rješenje. Zapravo, napravit ću dupli dataset za svaku tablicu. Jedan koji će imati optimistic lock i koji će preko klijentskog kursora dopuštati pregled zapisa, i drugi dataset sa server kursorom i pessimistic lock-om koji će biti korišten kada korisnik pokuša nešto editirati. Na taj način zaključavam samo onaj editirani zapis.

[Ovu poruku je menjao itf dana 23.04.2008. u 20:48 GMT+1]
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-3.sezampro.yu.



+395 Profil

icon Re: ADO komponente - pesimistično zaključavanje na SQL serveru 200523.04.2008. u 21:07 - pre 172 meseci
Citat:
itf: Ali to ne zaključava record prilikom njegova editiranja... a meni to treba.

Kad spominjes zakljucavanje recorda na sta tacno mislis ?
1.zastita memorijske lokacije na klijent aplikaciji u kojoj se nalaze podaci - dataset i njegova eventualna zastita u multithread rezimu
2.zastita fizicke lokacije podataka iz fajla *.mdf na sql serveru (tj. konkurentnost podataka )
3.zakljucavanje da "programski" ne moze da se pristupi podacima ako je datarow u edit rezimu

Objasnio sam ti i dao code za 2. primer

Citat:

Posto ne koristim Borlandove alate i klase ne znam kako ces je pozivati


Tj. da li ima neka borlandova db komponenta mehanizam za lock-ovanje kao na sql-u
(u .netu znam za sql konekciju postoji BeginTransactin i EndTransaction i da u njemu ima par opcija za protekciju podataka:ReadCommited,Serializable..itd )
i za DataSet koji ima metode Accept i RejectChanges i DataRow klasa koja ima BeginEdit i EndEdit za protekciju zapisa tj. rekorda

3. primer : Da nasledis tvoj TDataSet i da u njemu implementiras funkcije koje ce pre ulaska u taj edit rezim da ih zakljuca ... kao sto sam gore naveo (BeginEdit i EndEdit) .
Da postavljas flagove koji ce kontrolisati stanja tvog datarow-a i metode za dobijanje nizova datarow-a sa promenjenim vrednostima (insert update delete )

1.primer: Jedina ideja koja mi za sad pada napamet je da pokusas sa WIN32 API funkcijama nad podacima u dataset-u i datarow-u
http://msdn2.microsoft.com/en-us/library/aa366781(VS.85).aspx






Viva lollapalooza
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-3.sezampro.yu.



+395 Profil

icon Re: ADO komponente - pesimistično zaključavanje na SQL serveru 200523.04.2008. u 21:31 - pre 172 meseci
Citat:
itf
Ali to ne zaključava record prilikom njegova editiranja... a meni to treba.
Edit: Mislim da sam smislio rješenje. Zapravo, napravit ću dupli dataset za svaku tablicu. Jedan koji će imati optimistic lock i koji će preko klijentskog kursora dopuštati pregled zapisa, i drugi dataset sa server kursorom i pessimistic lock-om koji će biti korišten kada korisnik pokuša nešto editirati.
Na taj način zaključavam samo onaj editirani zapis.
[Ovu poruku je menjao itf dana 23.04.2008. u 20:48 GMT+1]


Pa otprilike ...
Imas kopiju i original rekorda - original cuvas tj. zakljucavas a kopiju menjas tj.editujes.
Kad korisnik submit-uje radis "paste" izmenjenih redova "kopije" u original i nazad u sql bazu ,
a ako cancel-uje samo brises kopiju i original opet upisujes u bazu .


Viva lollapalooza
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: ADO komponente - pesimistično zaključavanje na SQL serveru 200524.04.2008. u 08:52 - pre 172 meseci
Već implementirao i radi bez problema ;)
 
Odgovor na temu

[es] :: C/C++ programiranje :: ADO komponente - pesimistično zaključavanje na SQL serveru 2005

[ Pregleda: 3563 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.