2015-11-10 4 views
5

Python ich konsequent bin immer einPython3 - 'Wartewartezeitüberschreitung überschritten; versuchen einen Neustart Transaktion‘und nur Prozess auf der Datenbank

(1205, 'Lock wait timeout exceeded; try restarting transaction') 

Fehler, wenn ich in eine bestimmte Tabelle einzufügen versuchen. Wenn ich versuche, direkt von der MySQL-Konsole einzufügen, funktioniert es jedoch einwandfrei. Ein Blick in die

SHOW FULL PROCESSLIST 

auf der Datenbank zeigt keine anderen aktiven Abfragen. Da es sich um eine Entwicklungsdatenbank ohne angehängte Anwendungen handelt, kann ich mir kein Problem vorstellen. Es wird jedoch auf einem Server bereitgestellt, auf dem sich unsere Produktionsdatenbanken befinden. Aus diesem Grund möchte ich möglichst keine Rücksetzungen durchführen. Irgendwelche Ratschläge, wie man das debuggt?

Hinweis Wenn ich die Abfrage wird ausgeführt gegen die Datenbank mit SHOW FULL PROCESS, die schließlich nicht mit der obigen Meldung anzuzeigen, und dann von der MySQL-Konsole manuell einfügen, es funktioniert wie erwartet.

EDIT Hier ist ein Beispiel für die Abfrage:

INSERT INTO deals (user_ID, store_ID, storeChain_ID, title, dealSaving, 
dealDisclaimer, restriction, dealImage, dealURL, submit_ID, userProvider_ID, 
createDate, createDateTime, expirationDate, expirationDateTime, ZIP, STATE, 
city, businessType, DealType_ID, IP, rating, popular, dealSearchData, tag, 
submitName, provider_dealID) 
VALUES (NULL, 
     2651049, 
     NULL, 
     'Toronto East Community Arts Program', 
     'Three-Week Photography Workshop', 
     NULL, 
     NULL, 
     'https://a1.image.net/imgs/8423535b-bd3b-4e1e-afee-ab2869970a4c/700_q60.jpg', 
     'https://www.exmples.com/deals/1336374', 
     111, 
     1, 
     '2015-11-12', 
     '2015-11-12 10:01:58.282826', 
     '2015-11-17 09:59:59', 
     '2015-11-17 23:59:00', 
     'M4M 1K7', 
     'ON', 
     'Toronto', 
     NULL, 
     '1', 
     '127.0.0.1', 
     0, 
     144565, 
     'Three-Week Photography Workshop', 
     'Photography Class', 
     'Partner', 
     1336374) 

bearbeiten Ein Beispiel den Vorschlag, ist wie folgt:

self.DB['master']['cursor'].execute("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED") 
self.DB['master']['con'].commit() 
self.DB['master']['cursor'].execute(dealsquery,data) 
self.DB['master']['con'].commit() 
+0

Können Sie Ihre Python-Abfrage anzeigen? – Busturdust

+0

Ich habe eine Beispielabfrage hinzugefügt – user2694306

+0

Arbeiten Sie mit mehreren Threads.? –

Antwort

0

I Believe MySql verwendet „Repeatable Read "Isolation, die eine Sperre für die gesamte Transaktion (aka bis commit, glaube ich) halten wird. versuchen Sie eine andere Isolation mit Einstellung wie "Read Committed"

gesetzt, um commited in Python mysql lesen ist so etwas wie

cur = conn.cursor() cur.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")

bearbeiten: eine gute Einführungs Ressource für Isolationsstufen http://vladmihalcea.com/a-beginners-guide-to-database-locking-and-the-lost-update-phenomena/

+0

Ich habe versucht, dies vor meiner eigentlichen Insert-Anweisung hinzuzufügen, aber das Problem besteht immer noch. – user2694306

+0

haben Sie die Änderung vor dem Einfügen übernommen? Verpflichten Sie auch Ihre Beilage, bevor Sie fortfahren? – Busturdust

+0

Ja, auf jede Einfügung folgt ein Commit und ich habe auch versucht, die Anweisung vor meiner Einfügung zu begehen. Ich habe ein Beispiel zu meiner ursprünglichen Frage hinzugefügt – user2694306

4

Es Es stellt sich heraus, dass eine andere Komponente eine Verbindung hergestellt hat und die Anweisung commit() fehlt.