[python] Lock

mtip mtip na atlas.cz
Pondělí Únor 9 11:42:35 CET 2015


Ahoj,
narazil jsem na problém se zámkem.

Mám  aplikaci  na web serveru, která ukládá příznak booolean Zaplaceno
do MySQL databáze.
Občas  se ale stane, že potvrzení platby přijde najednou ve stejný čas
ze dvou zdrojů. Chtěl jsem to vyřešit zámkem, což ale nepomůže.

Princip kódu:

from threading import Lock
lock = Lock()
lock.acquire()
try:
    mysql_cursor.execute("SELECT Zaplaceno FROM platby WHERE Id=%s", (1,))
    if mysql_cursor.fetchall()[0]['Zaplaceno'] == 0:
        mysql_cursor.execute("UPDATE Zaplaceno=1 FROM platby WHERE Id=%s", (1,))
        mysql_connection.commit()
        # dalsi zpracovani platby...
finally:
    lock.release()



Pokud je request spuštěn 2x ve stený čas provede se zpracování platby 2x.
Přičemž ale SELECT je pod zámkem, takže by se neměl provést mezi SELECT a UPDATE druhého threadu.
Netušíte, kde může být problém?

Díky za odpovědi.

Mirek



Další informace o konferenci Python