W skrócie, mam problem z wykonaniem w skrypcie PHP serii updatów na bazie Oracle 11. Przy którymś z kolei updacie w momencie wykonanie oci_execute(..) skrypt zawisa i tyle. Na bazie działają dodatkowo 2 aplikacje seamowe i pierwsze skojarzenie to jakiś lock, który blokuje wykonanie updatu - nie udało mi się go w każdym razie w stanie odnaleźć.
Poniżej dokładniejsze informacje na temat problemu.
W skrypie PHP w pętli wykonywane są takie updaty:
......... UPDATE forecasts SET month_1 = 379, month_2 = 503, month_3 = 636, month_4 = 1146, month_5 = 1146, month_6 = 780, month_7 = 897, month_8 = 0, month_9 = 0, month_10 = 0, month_11 = 0, month_12 = 0 WHERE customer_id = 144689 AND service_id = 14019 AND period_id = 663 AND forecast_type = 'REAL'; UPDATE forecasts SET month_1 = 10, month_2 = 10, month_3 = 4, month_4 = 6, month_5 = 9, month_6 = 15, month_7 = 0, month_8 = 0, month_9 = 0, month_10 = 0, month_11 = 0, month_12 = 0 WHERE customer_id = 144689 AND service_id = 14023 AND period_id = 663 AND forecast_type = 'REAL'; UPDATE forecasts SET month_1 = 10, month_2 = 10, month_3 = 4, month_4 = 6, month_5 = 9, month_6 = 15, month_7 = 0, month_8 = 0, month_9 = 0, month_10 = 0, month_11 = 0, month_12 = 0 WHERE customer_id = 144689 AND service_id = 14023 AND period_id = 663 AND forecast_type = 'REAL'
Dziś ten ostatni zapisany update nie wykonuje się, a oci_execute się nie kończy (conajmniej przez kilka godzin). Ten sam update, nawet w czasie wykonywania skryptu, wykonany np w Toad wykonuje się bez problemu.
Poszukiwalem locka nastepujacym skryptem w trakcie wiszącego wywolania:
SELECT s.inst_id, s.sid, s.serial#, p.spid, s.username, s.program, s.sid || ',' || s.serial# FROM gv$session s JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id WHERE s.type != 'BACKGROUND';
Wynik przed wykonaniem skryptu jest pusty, a w trakcie wykonania gdy wisi:
USERNAME TYPE NAME LOCK REQUEST REQUEST_1 SID STATUS OSUSER MACHINE TERMINAL PROGRAM ID1 ID2 BLOCK
KLIK |AE |ORA$BASE S BRAK 0 134 ACTIVE root drupij pts/1 php@drupij (TNS V1-V3) 99 0 0
KLIK |TM |FORECASTS RX BRAK 0 134 ACTIVE root drupij pts/1 php@drupij (TNS V1-V3) 382256 0 0
KLIK |TX |X BRAK 0 134 ACTIVE root drupij pts/1 php@drupij (TNS V1-V3) 589846 26401 0 0
Aby uniknąć locków w trakcie updatów z innych aplikacji, dodałem na początku SELECT ... FOR UPDATE z danych które będą updatowane, i dopiero puszczam w tej samej tranzakcji te pojedyncze updaty, ale kończy się to dokładnie tak samo. (przy wywołaniu oci_execute(..., OCI_DEFAULT).
Wywołania z OCI_COMMIT_ON_SUCCESS kończą się tak samo.
Dziś zawiesza się zawsze na tym samym updacie. Choć wczoraj na innych (chyba).
Gdzie szukać przyczyny? Będę wdzięczny za pomysły.