Transakce jsem použít nechtěl, protože databáze nemusí být innodb dokonce ani mysql.
Mirek
--------------------------------
9. února 2015, 13:39:48, napsal jste:
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