2016-04-12 5 views
0

Ich habe ein seltsames Problem mit pymysql3 cursor.lastrowid Eigenschaft. Ich schreibe eine python3-Anwendung mit Threads. Es hat einen geöffneten pymysql3-Konnektor in einem Haupt-Thread und viele Funktionen, die wahllos/insert/update auf zufällige Weise tun können. Ich führe diese Funktionen in den Threads der Anwendung aus. Jede Funktion hat die nächste Konstruktion:pymysql3 cursor.lastrowid funktioniert manchmal nicht

def function...(link_to_connector) 
    .... 
    cur = link_to_connector.cursor(pymysql.cursors.DictCursor) 
    cur.execute(...) 
    id = cur.lastrowid #Used only in INSERT constructions 
    cur.close() 
    ... 

Der Stecker wurde in der nächsten Art und Weise geöffnet:

self.connector = pymysql.connect(host, user, pass, db, charset='utf8') 
self.connector.autocommit(True)  

Alle funktionieren, aber manchmal cur.lastrowid gleich 0 nach einem frischen Einfügevorgang. Eine tatsächlich eingefügte Zeile in einem DB hat eine ID ungleich Null. Die DB ist MySQL mit InnoDB-Tabellen.

Könnte mir jemand helfen,

  1. Was in diesem Fall läuft falsch?

  2. Ist es eine gute Methode, den Cursor in jeder Funktion zu öffnen und zu schließen?

Antwort

1

Ich habe dieses Problem gelöst. Das war eine typische Race-Bedingung, weil ein pymysql.connector() -Objekt keine Thread-sichere Sache ist.