Title: Re: [python] Lock
Díky za postrčení, nedošlo mi, že to může být jiný proces a ne thread.

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

Odpovedet emailem