<html><head><title>Re: [python] Lock</title>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
</head>
<body>
<span style=" font-family:'Courier New'; font-size: 9pt;">Díky za postrčení, nedošlo mi, že to může být jiný proces a ne thread.<br>
<br>
Transakce jsem použít nechtěl, protože databáze nemusí být innodb dokonce ani mysql.<br>
<br>
<br>
Mirek<br>
--------------------------------<br>
9. února 2015, 13:39:48, napsal jste:<br>
</span><table>
<tr>
<td width=10 bgcolor= #0000ff><br>
</td>
<td width=910><span style=" font-family:'courier new'; font-size: 9pt;">Web server miva typicky vice procesu a tak lokalni zamky nebudou fungovat.<br>
Presne na tyhle veci se ale hodi db transakce, rozhidne lepsi nastroj - podivej se na 'select ... for update' a 'isolation level'.<br>
On Feb 9, 2015 11:43 AM, "mtip" <<a href="mailto:mtip@atlas.cz">mtip@atlas.cz</a>> wrote:<br>
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">http://www.py.cz/mailman/listinfo/python</a><br>
<br>
Visit: <a href="http://www.py.cz">http://www.py.cz</a></td>
</tr>
</table>
</body>