Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Obsługa transakcji przez PHP, MySQL, ale niekoniecznie
ktuvok
post
Post #1





Grupa: Zarejestrowani
Postów: 243
Pomógł: 0
Dołączył: 30.11.2003

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


Mam skrypt o następującej konstrukcji:
  1. <?php
  2.  
  3. $SQL1 = &#092;"INSERT INTO ...\";
  4. $SQL2 = &#092;"UPDATE ...\";
  5. $SQL3 = &#092;"UPDATE ...\";
  6.  
  7. $Zacznij = mysql_query(&#092;"BEGIN;\");
  8. $Operacja1 = mysql_query($SQL1);
  9. $Operacja2 = mysql_query($SQL2);
  10. $Operacja3 = mysql_query($SQL3);
  11.  
  12. if (!mysql_error())
  13. {
  14. //Nie ma błędu, zatwierdzam transakcję
  15. $Wykonaj = mysql_query(&#092;"COMMIT;\");
  16. }
  17. else
  18. {
  19. $TrescBledu = mysql_error();
  20. //Wystąpił błąd bazy MySQL:
  21. $Wykonaj = mysql_query(&#092;"ROLLBACK;\");
  22. echo &#092;"Wystąpił następujący błąd bazy danych: $TrescBledu\";
  23. }
  24.  
  25. ?>

Czy taka konstrukcja jest poprawna?

Chodzi mi o to, czy jeśli błąd wystąpi na etapie Operacji1, a Operacja2 i
Operacja3 się powiodą, to czy mysql_error() również zwróci kod błędu?

Ewentualnie - jak inaczej to oprogramować?

I druga rzecz... Transakcja jest traktowana przez bazę w kontekście aktualnego identyfikatora połączenia z bazą, prawda? Ale którego? Każdy mój juzer łączy się z bazą z użyciem (z punktu widzenia bazy) tego samego loginu i hasła. W rezultacie zapytanie o CONNECTION_ID() daje za każdym razem inny rezultat, ale:
  1. <?php
  2.  
  3. $connection = mysql_connect(&#092;"host\", \"juzer\", \"hasło\");
  4.  
  5. ?>

zwraca mi w każdym przypadku Resource id #2 - dlaczego? Czy mogę w ten sposób bezpiecznie używać transakcji, nie martwiąc się, ze jeden juzer wycofa transakcję drugiego?

Pozdrawiam,
K
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
ktuvok
post
Post #2





Grupa: Zarejestrowani
Postów: 243
Pomógł: 0
Dołączył: 30.11.2003

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


OK, czyli jakoś tak to będzie:
  1. <?php
  2.  
  3. $SQL1 = &#092;"INSERT INTO ...\";
  4. $SQL2 = &#092;"UPDATE ...\";
  5. $SQL3 = &#092;"UPDATE ...\";
  6.  
  7. $Zacznij = mysql_query(&#092;"BEGIN;\");
  8. if(!$Zacznij)
  9. {
  10.  $BledyBazy[] = mysql_error();
  11. }
  12. if(!$BledyBazy)
  13. {
  14.  $Operacja1 = mysql_query($SQL1);
  15.  if(!$Operacja1)
  16.  {
  17. $BledyBazy[] = mysql_error();
  18.  }
  19. }
  20. if(!$BledyBazy)
  21. {
  22.  $Operacja2 = mysql_query($SQL2);
  23.  if(!$Operacja2)
  24.  {
  25. $BledyBazy[] = mysql_error();
  26.  }
  27. }
  28. if(!$BledyBazy)
  29. {
  30.  $Operacja3 = mysql_query($SQL3);
  31.  if(!$Operacja3)
  32.  {
  33. $BledyBazy[] = mysql_error();
  34.  }
  35. }
  36. if (!$BledyBazy)
  37. {
  38. //Nie ma błędu, zatwierdzam transakcję
  39. $Wykonaj = mysql_query(&#092;"COMMIT;\");
  40. }
  41. else
  42. {
  43. //Wystąpił błąd bazy MySQL:
  44. $Wykonaj = mysql_query(&#092;"ROLLBACK;\");
  45. echo &#092;"Wystąpił następujący błąd bazy danych:\";
  46. foreach($BledyBazy as $key=>$BledyBazy)
  47. {
  48. echo &#092;"<BR>$BledyBazy\";
  49. }
  50. }
  51.  
  52. ?>

Chyba, że da się jakoś prościej... Ma ktoś pomysł?


A co z moim (nieszczęsnym) pytaniem nr 2?
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 16.10.2025 - 09:41