2011-01-09 6 views
2

Ich weiß, dass Transaktionen mit einer InnoDB-Tabelle Autocommit sind, aber ich verstehe, dass für eine einzelne Aussage zu bedeuten? Ich möchte beispielsweise prüfen, ob ein Benutzer in einer Tabelle vorhanden ist. Wenn dies nicht der Fall ist, erstellen Sie ihn. Allerdings liegt eine Wettlaufbedingung vor. Ich glaube, dass die Verwendung einer Transaktion vor der Ausführung der Auswahl sicherstellen wird, dass die Tabelle bis zur nachfolgenden Einfügung unberührt bleibt und die Transaktion festgeschrieben wird. Wie können Sie das mit MySQLdb und Python machen?Wie erstellen Sie eine Transaktion, die mehrere Anweisungen in Python mit MySQLdb umfasst?

Antwort

4

Es gibt ein SELECT ... FOR UPDATE, mit dem Sie die Zeilen vor dem Lesen durch eine andere Transaktion sperren können, aber ich glaube, die Datensätze müssen an erster Stelle existieren. Dann kannst du tun, was du sagst, und entsperren, sobald du es begehst.

In Ihrem Fall denke ich, der beste Ansatz ist einfach eine eindeutige Einschränkung für den Benutzernamen festlegen und versuchen, einzufügen. Wenn Sie eine Schlüsselausnahme erhalten, können Sie dem Benutzer mitteilen, dass der Name bereits vergeben wurde.

+0

Sprechen Sie darüber: http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html – fncomp

+0

@JoshN ja, das ist, worüber ich spreche. Danke für das Posten des Links. – Hiro2k

Verwandte Themen