2009-03-03 15 views
0

Das hängt in PHP (5.2.6-Win32 + Oracle10g) ist es ein Fehler, oder mache ich etwas grundsätzlich falsch?Bleibt PHPs Oracle PDO bei DELETE hängen?

try { 
    $conn = new PDO($DB,$USER,$PASSWORD); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    //connected 
    try { 
     $conn->exec("DELETE FROM MY_TABLE"); 
     echo "done"; 
... 

Hinweis: Ich weiß nicht, ob dies ein Fehler ist oder nicht, ich bin zu raten, es ist. Da ich jedoch nach einer Schnellsuche keinen Fehlerbericht finden konnte. Ich könnte etwas falsch machen, also dachte ich, ich würde hier zuerst fragen, und für die Nachwelt, falls jemand anderes ein ähnliches Problem hat.

Antwort

1

Gibt es andere Aktivitäten in der Datenbank zur gleichen Zeit? Wenn ja, würde ich Deadlocks vermuten. Einige nicht festgeschriebene DML-Transaktionen können einige Zeilen des MY_TABLE sperren. Wenn Sie keine Rollback-Funktion benötigen, sollten Sie TRUNCATE anstelle von DELETE verwenden.

+0

Es gab keine anderen Aktivitäten und somit keine Deadlocks oder DML-Transaktionen. Also ich vermute, es ist eine Art Bug ... Aber Ihr Vorschlag, TRUNCATE zu verwenden, hat funktioniert, jetzt kann ich mit meiner Arbeit weitermachen, danke !!! –

+0

Beachten Sie, TRUNCATE ist DDL, wenn Sie hier Transaktionen verwenden, wird die Anweisung eine implizite Festschreibung verursachen und kann nicht zurückgesetzt werden –

1

ziemlich unwahrscheinlich, dass es hängt seit PDO im Einsatz zu sein scheint ziemlich viel, wenn auch, wie viel mit Oracle, ich weiß nicht.

A delete from my_table kann einige Zeit dauern, je nachdem, wie viele Datensätze gibt. Wie lange hast du gewartet, bevor du entschieden hast, dass es aufgehängt wurde und wie viele Datensätze in der Tabelle waren?

+0

Wartete 1 Stunde 4 Aufzeichnungen von zwei Spalten ohne Fremdschlüssel zu löschen, löst oder Indizes ... Ich glaube, Oracle nicht so langsam ist;) –

+0

Nein, würde ich glaube nicht. – paxdiablo

+0

Mein einziger anderer Vorschlag wäre, vor dem Exec zu echo, damit Sie wissen, dass das das Problem ist. Und um mehr von dem Code zu posten - ich frage mich, ob etwas früheres problematisch ist (speziell eine Ausnahme im äußeren try-Block, die verhindert, dass der exec aufgerufen wird). – paxdiablo

2

Ein DELETE ohne WHERE wird (wahrscheinlich) einen vollständigen Scan der Tabelle durchführen. Das heißt, es liest jeden Block unter der "High-Water-Mark" - das ist jeder Block, der jemals von der Tabelle verwendet wurde. Wenn also der Tisch einmal sehr groß war, kann es sehr lange dauern, nur eine Handvoll Datensätze zu löschen. [Weil es nicht ‚wissen‘, tut es nur vier Datensätze sind, bis sie alle, dass der Raum liest.]

A truncate dies nicht tut. Es verschiebt einfach die obere Grenze des Tisches, so dass alle verwendeten Blöcke schnell ungenutzt bleiben.

+0

danke für die Erklärung! –

0

Wenn eine Transaktion in derselben Tabelle ausgeführt wird, blockiert sie möglicherweise DELETE.

Verwandte Themen