2013-06-13 5 views
0

У меня сегодня очень странная проблема с оракулом.Oracle PHP update no response

Я настраиваю новый сервер с xampp для разработки, активировал mssql и oracle, и все было в порядке, пока я не попытался выполнить инструкцию update.

Каждый элемент select, insert и т. Д. Отлично работает с PHP 5.3.

Я также могу разобрать инструкцию и получить идентификатор ressource, но когда я попытаюсь выполнить инструкцию, весь мой сайт не отвечает.

никаких ошибок, ничего. просто таймаут, пока я не перезапущу apache.

здесь код ... это тестовый код, поэтому не должно быть никаких проблем.

$conn = oci_connect('***', '***', '***'); 

$query ="UPDATE CHAR*** SET TPOS = 14, ID = 5, DIFF = 'J' WHERE ***NR = '3092308' AND LA*** = '5'"; 
echo $query; 
echo '<br>'; 
echo $stid = oci_parse($conn, $query); 
oci_execute($stid, OCI_DEFAULT);  
oci_free_statement($stid2); 

Любые подсказки или идеи? :-( я уже пробовал переустановить Oracle Instant клиента и другую версию. Я использую 10g, как наш дб на данный момент.

наилучшими пожеланиями прокладочные

+0

Если вы посмотрите в базе данных, заблокирован ли сеанс? Возможно, вы пытаетесь обновить строку, заблокированную каким-либо другим сеансом? Можете ли вы «ВЫБЕРИТЬ ... ДЛЯ ОБНОВЛЕНИЯ» эту строку? –

+0

Возможно, вам следует вызвать 'oci_commit()' после запроса типа записи? – Narf

ответ

1

Строка может быть locked by another session. Если это случай, сеанс будет висеть, пока другая транзакция не заканчивается (фиксации/отката)

Вы должны сделать SELECT FOR UPDATE NOWAIT перед попыткой обновить строку (пессимистический запирающий):.

  • Если строка заблокирована, вы получите сообщение об ошибке и можете вернуть пользователю сообщение о том, что эта запись в настоящее время обновляется другим сеансом. В большинстве случаев явное сообщение предпочтительнее неопределенного ожидания.

  • Если строка доступна, вы убедитесь, что сеанс не изменяет ее содержимое до тех пор, пока вы не зафиксируете (и таким образом вы предотвратите любую форму lost update).

Есть и другие причины, почему простое обновление может занять много времени, но они менее вероятно, к примеру:

  • при обновлении unindexed foreign key, Oracle должен получить блокировку в целом родительской таблицы на короткое время. Это может занять много времени на занятой и/или большой таблице.
  • На столе могут быть триггеры, которые выполняют дополнительную работу.

Для дальнейшего чтения: pessimistic vs optimistic locking.

+0

да, вы были правы. я получил ORA-00054: ресурс занят и приобрел с ошибкой NOWAIT, поэтому какой-то другой оператор (скорее всего, мой из ранее без фиксации) блокирует таблицу – Pad

+0

@pad, возможно, это связано с предыдущей попыткой, которая не совершена и все еще зависает вокруг лениво. Вы можете запросить 'V $ SESSION' для сбора информации и в конечном итоге уничтожить блокирующие транзакции. Блокированный сеанс должен быть «ACTIVE» в этом представлении, а сеанс блокировки должен отображаться в столбце «BLOCKING_SESSION». –

+0

большое спасибо. моя проблема решена. я прекратил открытый сеанс. :) – Pad