A samozrejme, jako vzdy, je lepsi varianta bezzamkova: "UPDATE Zaplaceno = 1 FROM platby WHERE id=%s AND Zaplaceno = 0" Honza Král E-Mail: honza.k...@gmail.com Phone: +420 606 678585
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