Зависает ли PDO Oracle PHP при УДАЛЕНИИ?
Вопрос
Это зависает в Php (5.2.6-Win32 + Oracle10g) это ошибка, или я делаю что-то в корне неправильное?
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";
...
Примечание: Я не знаю, ошибка это или нет, я предполагаю, что это так.Однако, поскольку я не смог найти сообщение об ошибке для этого после быстрого поиска.Возможно, я делаю что-то не так, поэтому я решил сначала спросить здесь и для потомков, на случай, если у кого-то еще возникнет подобная проблема.
Решение
Выполняются ли другие действия в базе данных одновременно?Если да, то я бы заподозрил тупиковые ситуации.Некоторые незафиксированные транзакции DML могут блокировать некоторые строки MY_TABLE
.
Если вам не нужна возможность отката, рассмотрите возможность использования TRUNCATE
вместо того, чтобы DELETE
.
Другие советы
УДАЛЕНИЕ без указания WHERE приведет (скорее всего) к полному сканированию таблицы.Это означает, что он считывает каждый блок ниже "высокой отметки" - то есть каждый блок, который когда-либо использовался таблицей.Таким образом, если таблица когда-то была очень большой, то удаление всего лишь нескольких записей может занять очень много времени.[Потому что он не "знает", что существует только четыре записи, пока не прочитает все это пространство.]
Усечение этого не делает.Он просто перемещает отметку уровня воды в таблице, так что все использовавшиеся блоки быстро становятся неиспользуемыми.
Маловероятно, что он зависает, поскольку PDO, похоже, используется довольно часто, хотя насколько часто с Oracle, я не знаю.
A delete from my_table
это может занять некоторое время, в зависимости от количества имеющихся записей.Как долго вы ждали, прежде чем решить, что он завис, и сколько записей было в таблице?
Если в той же таблице выполняется транзакция, это может привести к блокировке вашего УДАЛЕНИЯ.