S Hibernate a vlastne i s Mysql spise zacinam, takze jsem si chtel nejdrive
provest nejake testy.
jeste bych upresnil, ze mi jde o konkurencni pristup do Mysql db kdy
jednotlivy konkurenti nepouzivaji stejny hibernate (tj defakto o pristup
primo do mysql);
Pouzil jsem dialekt mysql a i mysql innodb. A domnivam se ze by tedy melo
byt mozne zamknout bud radek nebo dokonce celou tabulku. Nepovedlo se mi ani
jedno.
session.load(class, ID, LockMode.Upgrade)
session.flush
probehlo bez vyjimky.
presto jsem byl pak schopen jit do mysql a rucne zmenit, smazat objekt, nebo
dokonce zamknout celou tabulku
session.createSQLQuerry("LOCK TABLE mytable WRITE);
session.flush();
probehla taktez bez vyjimky, nicmene db zamkla nebyla bylo mozne provadet
jakekoliv zmeny.
Rucni spusteni prikazu LOCK ... v mysql tabulku zamklo a vsechny session
pres hibernate se zastavily nez jsem opet tabulku odemkl. (To je chovani,
ktereho chci dosahnout)
Rikam si ze neco delam spatne, ale nemohu stale prijit co.
Dne 16. Ĩerven 2009 16:25 Lukas Barton <[email protected]> napsal(a):
> Jak presne Hibernate *zamyka *na MySQL najdes v danem dialectu.
> Jsou tam na to metody.
> Pricemz pesimisticke zamky (coz je i LockMode.UPGRADE) umi Hibernate jen
> pokud ho umi databaze (Typicky pres select ... for update).
> A vetsinou to zamkne jen jeden radek/stranku (zalezi na granuralite na dane
> DB a dane situaci - eskalace zamku).
> Zamknout celou tabulku je nutne pomoci SQL prikazu.
>
> Optimisticke zamykani umi Hibernate na kazde DB a dela ho automaticky pri
> kazdem updatu, vynutit je ho mozne pomoci LockMode.FORCE.
>
> Vice viz
> http://docs.jboss.org/hibernate/stable/core/reference/en/html/transactions-optimistic.html
>
> Lukas
>
>
> 2009/6/16 Pavel Nemec <[email protected]>
>
>> Dobry den,
>> mam docela specificky problem.
>> 2 aplikacni servery (jboss) na kterych bezi hybernate a mysql. Mysql
>> je nastavna tak ze se replikuje na obou serverech a tvari se tedy
>> jako jedna databaze.
>>
>> S databazi komunikuji vyhradne pres Hibernate. Jsem v situaci, kdy oba
>> servery budou ve stejny cas pracovat nad jednou tabulkou. Hledal jsem
>> moznost jakym zpusobem zamknout celou tabulku, s kterou potrebuji
>> pracovat. Nicmene vse co jsem nasel, je
>> session.get(Object, Lock.UPGRADE).
>> S tim ze je u navodu vetsinou poznamka, ze to funguje urcite na
>> Oraclu. Jestli tomu dobre rozumim, tak hibernate resi konkurencni
>> pristup zejmena pri vicenasobnem pristupu prave pres hibernate
>> (optimisticky pristup s verzovanim). Vypada to ze pristup pres primo
>> pres mysql resit neumi (pesimisticky pristup a zamikani db).
>>
>> Muze mne nekdo prosim spravne nasmerovat?
>>
>> Predem dekuji,
>> Pavel
>>
>
>