<div dir="ltr">Ahoj,<div><br></div><div>no, jestli ten kód vypadá opravdu přesně takto, tak dělá tohle:</div><div>* vytvoří úplně nový zámek a acquirene ho.</div><div>* udělá to sql</div><div>* releasene zámek.</div><div>No a druhý případný thread dělá to stejné:</div><div><div>* vytvoří úplně nový zámek a acquirene ho.</div><div>* udělá to sql</div><div>* releasene zámek.</div></div><div>Takže nic ničemu v ničem nezabrání. </div><div><br></div><div>Tohle se ale dělá transakcema, a pokud máš MyISAm engine, tak spíš zamčením </div><div>patřičných tabulek:</div><div>"LOCK TABLES platby READ"</div><div>...</div><div>"UNLOCK TABLES"</div><div><br></div><div>--<br></div><div>Petr</div><div><br></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2015-02-09 11:42 GMT+01:00 mtip <span dir="ltr"><<a href="mailto:mtip@atlas.cz" target="_blank">mtip@atlas.cz</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Ahoj,<br>
narazil jsem na problém se zámkem.<br>
<br>
Mám aplikaci na web serveru, která ukládá příznak booolean Zaplaceno<br>
do MySQL databáze.<br>
Občas se ale stane, že potvrzení platby přijde najednou ve stejný čas<br>
ze dvou zdrojů. Chtěl jsem to vyřešit zámkem, což ale nepomůže.<br>
<br>
Princip kódu:<br>
<br>
from threading import Lock<br>
lock = Lock()<br>
lock.acquire()<br>
try:<br>
mysql_cursor.execute("SELECT Zaplaceno FROM platby WHERE Id=%s", (1,))<br>
if mysql_cursor.fetchall()[0]['Zaplaceno'] == 0:<br>
mysql_cursor.execute("UPDATE Zaplaceno=1 FROM platby WHERE Id=%s", (1,))<br>
mysql_connection.commit()<br>
# dalsi zpracovani platby...<br>
finally:<br>
lock.release()<br>
<br>
<br>
<br>
Pokud je request spuštěn 2x ve stený čas provede se zpracování platby 2x.<br>
Přičemž ale SELECT je pod zámkem, takže by se neměl provést mezi SELECT a UPDATE druhého threadu.<br>
Netušíte, kde může být problém?<br>
<br>
Díky za odpovědi.<br>
<br>
Mirek<br>
<br>
_______________________________________________<br>
Python mailing list<br>
<a href="mailto:python@py.cz">python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br>
<br>
Visit: <a href="http://www.py.cz" target="_blank">http://www.py.cz</a><br>
</blockquote></div><br></div>