<p dir="ltr">Web server miva typicky vice procesu a tak lokalni zamky nebudou fungovat.</p>
<p dir="ltr">Presne na tyhle veci se ale hodi db transakce, rozhidne lepsi nastroj - podivej se na 'select ... for update' a 'isolation level'.</p>
<div class="gmail_quote">On Feb 9, 2015 11:43 AM, "mtip" <<a href="mailto:mtip@atlas.cz">mtip@atlas.cz</a>> wrote:<br type="attribution"><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>