Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: transakcje
Forum PHP.pl > Forum > PHP
ernik
rozpoczynam transakcje, w trakcie sprawdzam jakies warunki i w przypadku false, wychodzi z danej funkcji z bledem i nie dociera do polecenia COMMIT,
ale zmiany w bazie i tak sa dokonywane blink.gif co jest? czemu tak sie dzieje?
  1. <?php
  2.  
  3. mysql_query(&#092;"BEGIN;\",$connect);
  4. mysql_query(jakis insert);
  5. if(costam) return false;
  6. mysql_query(&#092;"COMMIT;\",$connect);
  7.  
  8. ?>
Jarod
Cytat(ernik @ 2005-05-16 22:45:03)
rozpoczynam transakcje,  w trakcie sprawdzam jakies warunki i w przypadku false, wychodzi z danej funkcji z bledem i nie dociera do polecenia COMMIT,
ale zmiany w bazie i tak sa dokonywane blink.gif  co jest? czemu tak sie dzieje?
  1. <?php
  2.  
  3. mysql_query(&#092;"BEGIN;\",$connect);
  4. mysql_query(jakis insert);
  5. if(costam) return false;
  6. mysql_query(&#092;"COMMIT;\",$connect);
  7.  
  8. ?>


Masz przykład:
  1. <?php
  2.  
  3. //Połączenie z bazą danych
  4. $conn = mysql_connect($server, $identyfikator, $haslo)
  5. or die (&#092;"Nie udało się połączyć z bazą danych! BŁĄD: \".mysql_error());
  6.  
  7. //Wybór bazy danych
  8. or die (&#092;"Nie udało się wybrać bazy! BŁĄD: \".mysql_error());
  9.  
  10. //------------------->ROZPOCZCIE TRANSAKCJI
  11. $query = &#092;"BEGIN WORK\";
  12. $result = mysql_query($query)
  13. or die (&#092;"Zapytanie nieudane! BŁĄD: \".mysql_error());
  14.  
  15. //Jakiś insert 1
  16. $query = &#092;"Insert.....;\";
  17. $result = mysql_query($query)
  18. or die (&#092;"Zapytanie nieudane! BŁĄD: \".mysql_error());
  19.  
  20. //Jakiś insert 2
  21. $query = &#092;"Insert.....;\";
  22. $result = mysql_query($query)
  23. or die (&#092;"Zapytanie nieudane! BŁĄD: \".mysql_error());
  24.  
  25.  
  26. //------------------> KONIEC TRANSAKCJI
  27. $query = &#092;"COMMIT WORK\";
  28. $result = mysql_query($query)
  29. or die (&#092;"Zapytanie nieudane! BŁĄD: \".mysql_error());
  30.  
  31. ?>


Jeśli inerst 1 powiedzie się a insert 2 nie powiedzie się to nic nie zostanie zapisane. Tabele muszą być InnoDB. W mysql > 4.1.x są chyba domyślne - sprawdź w archiwum gdzieś o tym pisałem. Jeśli mój przykład zawiedzie to znaczy, że w bazie ustawione jest AITOCOMMIT=1 ( automatycznie wszystko zatwierdza) więc zmień to na 0

pozdrawiam

EDIT: Tu masz więcej na ten temat http://forum.php.pl/index.php?showtopic=29...je+i+blokowanie
ernik
nie zadzialalo,
nawet rollback nie dziala jak wstawie przed zwroceniem bledu

czy ustawiajac autocommit=0 musze nawet pojedyncze INSERT,UPDATE,DELETE zawierac w (begin;) -tu polecenie (commit;)?

normalnie masakra, transakcja nie chce zadzialac... blink.gif
wstawiam pomiedzy inserty - "twardy" 'return' mimo ze nie dodaje do drugiej tabelki, to do pierwszej dodaje... mad.gif

EDIT:wreszcie zadzialalo , wystarczylo zmienic tabelke na InnoDB (niedopatrzenie - ale to z nawalu pracy)

no wlasnie czemu tworzy mi tabelki myisam, skoro w skrypcie mam ustawione TYPE=InnoDB dla kazdej tabelki, skrypt wykonuje sie prawidlowo ale tabelki sa myisam mad.gif
nospor
w przypadku, gdy wychodzisz z funkcji przez zakonczeniem transakcji musisz dać rollback, aby wycofać wszelkie zmiany.
commit dajesz gdy zatwierdzasz zmiany, rollback gdy nie zatwierdzasz i chesz się wycofać. Mi to zawsze dziala.

Wniosek: gdy błąd to rollback
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.