Web server miva typicky vice procesu a tak lokalni zamky nebudou fungovat. Presne na tyhle veci se ale hodi db transakce, rozhidne lepsi nastroj - podivej se na 'select ... for update' a 'isolation level'. On Feb 9, 2015 11:43 AM, "mtip" <m...@atlas.cz> wrote:
> 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