Ahoj,

no, jestli ten kód vypadá opravdu přesně takto, tak dělá tohle:
* vytvoří úplně nový zámek a acquirene ho.
* udělá to sql
* releasene zámek.
No a druhý případný thread dělá to stejné:
* vytvoří úplně nový zámek a acquirene ho.
* udělá to sql
* releasene zámek.
Takže nic ničemu v ničem nezabrání.

Tohle se ale dělá transakcema, a pokud máš MyISAm engine, tak spíš zamčením
patřičných tabulek:
"LOCK TABLES platby READ"
...
"UNLOCK TABLES"

--
Petr





2015-02-09 11:42 GMT+01:00 mtip <m...@atlas.cz>:

> 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
>
> _______________________________________________
> Python mailing list
> python@py.cz
> http://www.py.cz/mailman/listinfo/python
>
> Visit: http://www.py.cz
>
_______________________________________________
Python mailing list
python@py.cz
http://www.py.cz/mailman/listinfo/python

Visit: http://www.py.cz

Odpovedet emailem