Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obsługa transakcji przez skrypt PHP
Forum PHP.pl > Forum > Bazy danych > MySQL
ktuvok
Piszę skrypt, który zapisuje dane w kilku tabelach bazy MySQL. Ponieważ dane
muszą trzymać się kupy, ustawiłem sobie typ tabeli na InnoDB i próbuję
używać transakcji. W samej bazie nie ma problemu: "BEGIN; ... COMMIT;" albo
"... ROLLBACK" i sprawa załatwiona. Ale w skrypcie php?

Pytania mam takie:

1. Czy jeśli napiszę coś takiego:
  1. <?php
  2.  
  3. $SQL1 = &#092;"BEGIN;\";
  4. $SQL2 = &#092;"UPDATE Tabela SET Pole1=1 WHERE ID=8;\";
  5. mysql_query($SQL1);
  6. mysql_query($SQL2);
  7.  
  8. ?>

to czy wykonanie instrukcji $SQL1 nie powoduje przypadkiem, że WSZYSTKIE
zapytania do tej bazy będą oczekiwać "COMMIT" albo "ROLLBACK" na końcu?
Wolałbym aby dotyczyło to aktualnego połączenia, ale nigdzie nie jest to
jasno napisane...

2. Jak uzależnić wycofanie transakcji od wystąpienia błędu? Czy wystarczy to
zrobić tak:
  1. <?php
  2.  
  3. $SQL1 = &#092;"BEGIN;\";
  4. $SQL2 = &#092;"UPDATE Tabela SET Pole1=1 WHERE ID=8;\";
  5. $SQL3 = &#092;"UPDATE Tabela1 SET Pole='aaaa' WHERE ID=150;\";
  6. mysql_query($SQL1);
  7. $Wykonaj1 = mysql_query($SQL2);
  8. $Wykonaj2 = mysql_query($SQL3);
  9. if($Wykonaj1 != true || $Wykonaj2 != true)
  10. {
  11. mysql_query(&#092;"ROLLBACK;\");
  12. }
  13. else
  14. {
  15. mysql_query(&#092;"COMMIT;\");
  16. }
  17.  
  18. ?>


3. Czy wykonanie na końcu "COMMIT" bądź "ROLLBACK" nie spowoduje przypadkiem zatwierdzenia lub wycofania WSZYSTKICH innych transakcji równolegle zainicjowanych przez równolegle działające skrypty (lub inną instancję tego samego skryptu)?

Pewnie zaraz ktoś napisze żebym się przesiadł na Postrgresa, ale niestety
nie mogę... Działam na MySQL 4.0.21.

Podajcie proszę jakieś wskazówki.

--
Pozdrawiam,
Krzysiek
popbart
Nie chcę cię wprowadzać w błąd ale chyba można to załatwić jednym połączeniem
  1. <?php
  2.  
  3. $SQL = &#092;"BEGIN;
  4. UPDATE Tabela SET Pole1=1 WHERE ID=8;
  5. UPDATE Tabela1 SET Pole='aaaa' WHERE ID=150;&#092;";
  6. mysql_query($SQL);
  7.  
  8. ?>
ktuvok
Nie, tak się nie da...
Każda operacja na bazie musi być wysłana na serwer osobno. W przeciwnym wypadku otrzymuję komunikat o błędzie:

"Something is wrong in your SQL syntax near ; UPDATE"

questionmark.gifquestionmark.gif?

--
Pozdrawiam,
Krzysiek
mhs
Cytat
nie powoduje przypadkiem, że WSZYSTKIE
zapytania do tej bazy będą oczekiwać "COMMIT" albo "ROLLBACK" na końcu?

nie - transakcja odbywać się będzie w obrębie Twojego, jednego połączenia, także nie ma tutaj niebezpieczeństw... możesz z resztą przeprowadzić mały test

Cytat
Wolałbym aby dotyczyło to aktualnego połączenia, ale nigdzie nie jest to
jasno napisane...

z tego co kiedyś sprawdzałem to faktycznie dzieje się to w obrębie jednego połaczenia...z resztą po to chyba są mechanizmy izolacji transakcji

Cytat
Czy wystarczy to zrobić tak:

jeżeli tylko logika działania aplikacji w kodzie php jest okey to jak najbardziej wystarczy coś takiego

Cytat
wykonanie na końcu "COMMIT" bądź "ROLLBACK" nie spowoduje przypadkiem zatwierdzenia lub wycofania WSZYSTKICH innych transakcji równolegle zainicjowanych przez równolegle działające skrypty (lub inną instancję tego samego skryptu)?

poczytaj o regułach ACID - tam znajdziesz odpowiedź (a także o poziomach izolacji ANSI/ISO)

Cytat
Pewnie zaraz ktoś napisze żebym się przesiadł na Postrgresa, ale niestety
nie mogę... Działam na MySQL 4.0.21.

pomijając różnice pomiędzy PostgreSQL a MySQL'em to Twoje wątpliwości właściwie nie mają znaczenia jaki wykorzystujesz system zarządzania bazą danych, gdyż Twoje pytania dotyczą problemów wspólnych dla tych SZBD

pozdrawiam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.