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