V prvnim pripade musite volat session.get. Session.load udela proxy, ktera
se inicializuje az po pristoupeni na jeji property.
Session.flush je zbytecne, toto volani synchronizuje stav v pameti se stavem
v DB, nikoliv naopak.
session.createSQLQuerry("LOCK TABLE mytable WRITE) neudela nic, jen vytvori
objekt SqlQuery.
Na tomto objektu musite zavolat executeUpdate.
Flush je zase zbytecny.
Doporucil bych si precist tu dokumentaci celou :-)
A javadoc vsech metod na tride Session.
Lukas Barton
2009/6/19 Pavel Nemec <[email protected]>
> 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
>>>
>>
>>
>