Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z wykonaniem updatu -> oci_execute
drussek
post 27.07.2012, 13:42:15
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 27.07.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 13:51