[Javalist] Adatbázis lock

Keresztes Jozsef jkeresztes at vati.hu
2012. Sze. 14., P, 13:44:25 CEST


Ezt a problémát 2 adatbázis connection-nel (A,B) lehet szépen megoldani:

 

Első lépés: A-connection lock-ol egy sort a táblából (nevezzük ezt a szemafornak). 

Lehet UPDATE-tel vagy ahogy valaki írta SELECT FOR UPDATE paranccsal.

 

Második, és többi lépés: B-connection azt csinál amit akar: insert, update, delete, commit, insert, update, delete, commit,… (kivéve a szemafor piszkamiszkálását)

 

Utolsó lépés A-connection commit.

 

 

From: Vig, Balázs [mailto:balazs.vig at datasolutions.hu] 
Sent: Friday, September 14, 2012 1:26 PM
To: Java lista
Subject: Re: [Javalist] Adatbázis lock

 

Ezt tudom, de ha lefut az update (márpedig több commit is van), akkor utána a várakozó update is lefut. Vagyis nem sikerült eltiltanom a másik klienst a sor kezelésétől, csak feltartottam egy kicsit.

Üdv:
Vig Balázs



2012. szeptember 14. 12:59 Keresztes Jozsef írta, <jkeresztes at vati.hu>:

ÁLLJ !

 

Ha egy sorra kiadsz egy UPDATE-et azt a sort automatikusan lock-olja az adatbázis, addig nem tud vele senki szórakozni amíg egy commit vagy rollback-et végre nem hajt az eljárásod. Ez teljesen automatikus, próbáld ki.

 

Joe

 

From: Vig, Balázs [mailto:balazs.vig at datasolutions.hu] 
Sent: Friday, September 14, 2012 12:56 PM
To: Java lista
Subject: Re: [Javalist] Adatbázis lock

 

De nekem row lock kell: csak az adott sorral ne szórakozzon senki, a többi sort lehet szerkeszteni.

Most azon gondolkodom, hogy oracle alatt a dbms_lock-kal létrehozok egy lockot: myapplock[rowid] néven, és amikor másik session akar lokkolni, akkor ellenőrzi az ilyen id-jű foglalás meglétét: ha nem sikerül lokkolni, akkor keressen magának másik elfoglaltságot ;)

Egy-egy folyamat percekig is eltarthat (extrém esetben órák), ilyenkor fontos, hogy azért más feladat tudjon haladni. Mivel ilyen hosszú időről beszélünk, és a folyamat közben lehet (van) commit is, ezért nem állíthatom be, hogy a tranzakció végén automatikusan oldja a lokkot, azt nekem kell manuálisan a folyamat végén. Ez OK, de mi van akkor, ha egy kliens elszáll? Ilyenkor a lock megmarad, de nem lesz senki, aki feloldja. Tehát kell valami takarító mechanizmus is....

Vagy simán csak megmondom, hogy egyszerre csak egy klienst futtassanak? ;) (nem kéne...)

Üdv:
Vig Balázs





2012. szeptember 14. 12:15 Keresztes Jozsef írta, <jkeresztes at vati.hu>:

Vagyis konkrétan ezt kell csinálni:

 

lock table szemafor in exclusive mode;

update table_a …;

insert into table_b …;

…

commit;

 

Jelöljetek ki egy táblát (a példában “szemafor”), de lehet máshogy is…

 

Joe

 

 

From: Vig, Balázs [mailto:balazs.vig at datasolutions.hu] 
Sent: Friday, September 14, 2012 12:05 PM
To: Java lista
Subject: [Javalist] Adatbázis lock

 

Sziasztok!



Van egy Hibernate alapú kliensem, ami több példányban is futhat. A kliens feladata, hogy az adatbázis objektumokon műveleteket végezzen.
Hogyan lehet azt garantálni, hogy egy objektummal csak az egyik kliens foglalkozhasson: ha az egyik már elkezdett dolgozni rajta, akkor másik már ne tudjon.

Támogatja-e ezt valahogy a hibernate, vagy a jdbc? (eddig nem találtam erre semmit). Vagy nekem kell valami mókolnom az adatbázisban?

Üdv:
Vig Balázs


_______________________________________________
Javalist mailing list
Javalist at lists.javaforum.hu
http://lists.javaforum.hu/mailman/listinfo/javalist

 


_______________________________________________
Javalist mailing list
Javalist at lists.javaforum.hu
http://lists.javaforum.hu/mailman/listinfo/javalist

 

--------- következő rész ---------
Egy csatolt HTML állomány át lett konvertálva...
URL: <http://lists.javaforum.hu/pipermail/javalist/attachments/20120914/6e3b3990/attachment.html>


További információk a(z) Javalist levelezőlistáról