Még arra vigyázzatok, hogy pl. MSSQL-ben alapból page lock van, és a read committed izolációt lockkal oldják meg. Tehát egy select is blokkolhat egy updatet, valamint 2 különböző sorra kiadott update is blokkolja egymást, ha a sorok egy pagen vannak. Szóval az updatekbe javaslom még a with(rowlock) hintet ilyenkor. Tapasztalatból mondom, mint olyan ember, aki orákel után nagyfokú hányingerrel küzdött MSSQLben :)<br>
<br><div class="gmail_quote">2012. szeptember 14. 13:37 Istvan Verhas írta, <span dir="ltr"><<a href="mailto:istvan@verhas.com" target="_blank">istvan@verhas.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word">Ezt úgy szokás megoldani, hogy van egy erre a célra dedikált oszlopod legyen a neve most lockedby ami NULL értékű ha senki nem foglalkozik az adott rekorddal. Minden kliensnek van egyedi azonosítója amivel kitölti ezt az oszlopot ha lockolni akarja azt a recordot. Ezt úgy teszi meg, hogy update-eli a saját id-val majd select-ál a saját id-ra, hogy tényleg sikerült-e illetve neki sikerült-e update-elni. Amikor kész van akkor pedig ismát NULL-ra update-eli. Biztos van neki szép neve is de azt nem tudom.<div>
Egyébként működik ez akkor is ha egyszerre nem egy hanem több rekordot is szeretnél lockolni.</div><div><br><div>
<span style="text-indent:0px;letter-spacing:normal;font-variant:normal;text-align:auto;font-style:normal;font-weight:normal;line-height:normal;border-collapse:separate;text-transform:none;font-size:medium;white-space:normal;font-family:Helvetica;word-spacing:0px"><div>
Verhás István<br>JIRA szakértő<br>Verhás & Verhás Szoftver Manufaktúra Kft.<br><a href="mailto:istvan@verhas.com" target="_blank">istvan@verhas.com</a><br>t: <a href="tel:%2B36%2830%293997117" value="+36303997117" target="_blank">+36(30)3997117</a><br>
skype: verhasi</div></span>
</div>
<br><div><div>On Sep 14, 2012, at 1:26 PM, Vig, Balázs wrote:</div><br><blockquote type="cite">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.<br>
<br>Üdv:<br><b>Vig Balázs<br>
</b>
<br><br><div class="gmail_quote">2012. szeptember 14. 12:59 Keresztes Jozsef írta, <span dir="ltr"><<a href="mailto:jkeresztes@vati.hu" target="_blank">jkeresztes@vati.hu</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div link="blue" vlink="purple" lang="HU"><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">ÁLLJ !<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">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.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">Joe<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""><u></u> <u></u></span></p><p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Vig, Balázs [mailto:<a href="mailto:balazs.vig@datasolutions.hu" target="_blank">balazs.vig@datasolutions.hu</a>] <br>
<b>Sent:</b> Friday, September 14, 2012 12:56 PM<br><b>To:</b> Java lista<br><b>Subject:</b> Re: [Javalist] Adatbázis lock<u></u><u></u></span></p><div><div><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal" style="margin-bottom:12.0pt">
De nekem row lock kell: csak az adott sorral ne szórakozzon senki, a többi sort lehet szerkeszteni.<br><br>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 ;)<br>
<br>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....<br>
<br>Vagy simán csak megmondom, hogy egyszerre csak egy klienst futtassanak? ;) (nem kéne...)<br clear="all"><br>Üdv:<br><b>Vig Balázs<br></b><br><br><br><br><u></u><u></u></p><div><p class="MsoNormal">2012. szeptember 14. 12:15 Keresztes Jozsef írta, <<a href="mailto:jkeresztes@vati.hu" target="_blank">jkeresztes@vati.hu</a>>:<u></u><u></u></p>
<div><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">Vagyis konkrétan ezt kell csinálni:</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""> </span><u></u><u></u></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Courier;color:blue;background:white" lang="EN-US">lock</span><span style="font-size:10.0pt;font-family:"Courier New";background:white" lang="EN-US"> </span><span style="font-size:10.0pt;font-family:Courier;color:blue;background:white" lang="EN-US">table</span><span style="font-size:10.0pt;font-family:"Courier New";background:white" lang="EN-US"> szemafor </span><span style="font-size:10.0pt;font-family:Courier;color:blue;background:white" lang="EN-US">in</span><span style="font-size:10.0pt;font-family:"Courier New";background:white" lang="EN-US"> </span><span style="font-size:10.0pt;font-family:Courier;color:blue;background:white" lang="EN-US">exclusive</span><span style="font-size:10.0pt;font-family:"Courier New";background:white" lang="EN-US"> </span><span style="font-size:10.0pt;font-family:Courier;color:blue;background:white" lang="EN-US">mode;</span><u></u><u></u></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:"Courier New";background:white" lang="EN-US">update table_a …;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none">
<span style="font-size:10.0pt;font-family:"Courier New";background:white" lang="EN-US">insert into table_b …;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:"Courier New";background:white" lang="EN-US">…</span><u></u><u></u></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Courier;color:blue;background:white" lang="EN-US">commit;</span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none">
<span style="font-size:10.0pt;font-family:Courier;color:blue;background:white" lang="EN-US"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Courier;color:blue;background:white" lang="EN-US">Jelöljetek ki egy táblát (a példában “szemafor”), de lehet máshogy is…</span><u></u><u></u></p>
<div><p class="MsoNormal" style="text-autospace:none"><span style="font-size:10.0pt;font-family:Courier;color:blue;background:white" lang="EN-US"> </span><u></u><u></u></p><p class="MsoNormal" style="text-autospace:none">
<span style="font-size:10.0pt;font-family:Courier;color:blue;background:white" lang="EN-US">Joe</span><u></u><u></u></p><p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""> </span><u></u><u></u></p><p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Vig, Balázs [mailto:<a href="mailto:balazs.vig@datasolutions.hu" target="_blank">balazs.vig@datasolutions.hu</a>] <br>
<b>Sent:</b> Friday, September 14, 2012 12:05 PM<br><b>To:</b> Java lista<br><b>Subject:</b> [Javalist] Adatbázis lock</span><u></u><u></u></p><p class="MsoNormal"> <u></u><u></u></p></div><p class="MsoNormal" style="margin-bottom:12.0pt">
Sziasztok!<u></u><u></u></p><div><div><p class="MsoNormal" style="margin-bottom:12.0pt"><br><br>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.<br>
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.<br><br>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?<br clear="all">
<br>Üdv:<br><b>Vig Balázs</b><u></u><u></u></p></div></div></div></div><p class="MsoNormal" style="margin-bottom:12.0pt"><br>_______________________________________________<br>Javalist mailing list<br><a href="mailto:Javalist@lists.javaforum.hu" target="_blank">Javalist@lists.javaforum.hu</a><br>
<a href="http://lists.javaforum.hu/mailman/listinfo/javalist" target="_blank">http://lists.javaforum.hu/mailman/listinfo/javalist</a><u></u><u></u></p></div><p class="MsoNormal"><u></u> <u></u></p></div></div></div></div>
<br>_______________________________________________<br>
Javalist mailing list<br>
<a href="mailto:Javalist@lists.javaforum.hu" target="_blank">Javalist@lists.javaforum.hu</a><br>
<a href="http://lists.javaforum.hu/mailman/listinfo/javalist" target="_blank">http://lists.javaforum.hu/mailman/listinfo/javalist</a><br>
<br></blockquote></div><br>
_______________________________________________<br>Javalist mailing list<br><a href="mailto:Javalist@lists.javaforum.hu" target="_blank">Javalist@lists.javaforum.hu</a><br><a href="http://lists.javaforum.hu/mailman/listinfo/javalist" target="_blank">http://lists.javaforum.hu/mailman/listinfo/javalist</a><br>
</blockquote></div><br></div></div><br>_______________________________________________<br>
Javalist mailing list<br>
<a href="mailto:Javalist@lists.javaforum.hu">Javalist@lists.javaforum.hu</a><br>
<a href="http://lists.javaforum.hu/mailman/listinfo/javalist" target="_blank">http://lists.javaforum.hu/mailman/listinfo/javalist</a><br>
<br></blockquote></div><br>