To mój pierwszy własny wątek na tym forum, ale skończyły mi się pomysły i nadzieja tylko w wiedzy forumowiczów.

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:
  1. .........
  2. UPDATE forecasts SET
  3. month_1 = 379,
  4. month_2 = 503,
  5. month_3 = 636,
  6. month_4 = 1146,
  7. month_5 = 1146,
  8. month_6 = 780,
  9. month_7 = 897,
  10. month_8 = 0,
  11. month_9 = 0,
  12. month_10 = 0,
  13. month_11 = 0,
  14. month_12 = 0
  15. WHERE
  16. customer_id = 144689
  17. AND service_id = 14019
  18. AND period_id = 663
  19. AND forecast_type = 'REAL';
  20.  
  21. UPDATE forecasts SET
  22. month_1 = 10,
  23. month_2 = 10,
  24. month_3 = 4,
  25. month_4 = 6,
  26. month_5 = 9,
  27. month_6 = 15,
  28. month_7 = 0,
  29. month_8 = 0,
  30. month_9 = 0,
  31. month_10 = 0,
  32. month_11 = 0,
  33. month_12 = 0
  34. WHERE
  35. customer_id = 144689
  36. AND service_id = 14023
  37. AND period_id = 663
  38. AND forecast_type = 'REAL';
  39.  
  40. UPDATE forecasts SET
  41. month_1 = 10,
  42. month_2 = 10,
  43. month_3 = 4,
  44. month_4 = 6,
  45. month_5 = 9,
  46. month_6 = 15,
  47. month_7 = 0,
  48. month_8 = 0,
  49. month_9 = 0,
  50. month_10 = 0,
  51. month_11 = 0,
  52. month_12 = 0
  53. WHERE
  54. customer_id = 144689
  55. AND service_id = 14023
  56. AND period_id = 663
  57. AND forecast_type = 'REAL'
  58.  


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:
  1. SELECT s.inst_id,
  2. s.sid,
  3. s.serial#,
  4. p.spid,
  5. s.username,
  6. s.program,
  7. s.sid || ',' || s.serial#
  8. FROM gv$session s
  9. JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
  10. 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.