Ist PHP Oracle PDO hängen DELETE?
Frage
Dies hängt in Php (5.2.6-Win32 + Oracle10g) ist es ein Fehler, oder ich mache etwas grundlegend falsch?
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. Doch wie kann ich nicht einen Fehlerbericht für diesen nach kurzer Suche finden. Ich könnte etwas falsch zu machen, so dass ich dachte, ich zum ersten Mal hier fragen würde, und für die Nachwelt, falls jemand anderes hat ein ähnliches Problem.
Lösung
Gibt es noch andere Aktivitäten gehen in der Datenbank zur gleichen Zeit auf? Wenn ja, würde ich Deadlocks vermuten. Einige uncommitted DML-Transaktion (en) könnten einige Zeilen der MY_TABLE
werden verriegelt wird.
Wenn Sie keine Rollback-Funktion benötigen, sollten TRUNCATE
anstelle von DELETE
.
Andere Tipps
Eine DELETE ohne WHERE wird (wahrscheinlich) einen vollständigen Scan der Tabelle. Das bedeutet, dass es für jeden Block nach der ‚Hochwassermarke‘, heißt es -, dass jeder Block ist, die jemals von der Tabelle verwendet wurde. Also, wenn der Tisch ist, zu einer Zeit, sehr groß, dann kann es eine sehr lange Zeit dauern, nur eine Handvoll von Aufzeichnungen zu löschen. [Weil es ‚wissen‘ nicht, dass es nur vier Datensätze, bis es diesen Raum alles liest.]
Ein truncate tut dies nicht. Es bewegt sich einfach die Hochwassermarke der Tabelle, so dass alle Blöcke, die sich schnell in Gebrauch waren ungenutzt werden.
ziemlich unwahrscheinlich, dass es hängt seit PDO im Gebrauch ziemlich viel zu sein scheint, obwohl, wie viel mit Oracle, ich weiß es nicht.
Ein delete from my_table
kann einige Zeit dauern, je nachdem, wie viele Datensätze gibt. Wie lange hat warten Sie vor der Entscheidung, es war gehangen und wie viele Datensätze wurden in der Tabelle?
Wenn es eine Transaktion auf dem gleichen Tisch läuft, könnte es Ihre DELETE blockieren.