Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Transakcje w ADODB
Forum PHP.pl > Forum > Gotowe rozwiązania > Skrypty obsługi baz danych
Kamil J.
Próbuję zrozumieć jak działają transakcję. Używam adodb i wg. manuala http://phplens.com/adodb/tutorial.smart.transactions.html próbuje to przetestować, lecz nie działa.


  1. <?php
  2. $db->StartTrans();
  3. $db->Execute("update tabela se p1 = 'ver zmieniona' where id = 1;");
  4. $db->Execute("update tabela set p2 = 'ver zmieniona2' where id = 1;");
  5. $db->CompleteTrans();
  6. ?>


Tutaj mam 2 przykładowe zapytania, 1 zawiera błąd, 2 jest dobre.
Ja to rozumiem tak: jeśli jakiegoś zapytania nie może wykonać to nie powinien wykonywać innych zapytań, a w tym przypdaku niestety to nie działa i 2 zap. jest wykonywane.

Czy coś źle rozumiem. Z góry dziękuje za odpowiedź.
wipo
Nie se tylko set
Sabistik
Przenoszę na gotowe skrypty.
Kamil J.
Cytat(wipo @ 16.12.2006, 10:03:55 ) *
Nie se tylko set


Wiem, przecież specjalnie zrobiłem ten błąd smile.gif

Czyli źle rozumiem istote transakcji? Nie powinno jej przerwać po błędzie w 1 zapytaniu?

pzdr
Fallout
to nie do końca tak.

  1. <?php
  2. mysql_query('START TRANSACTION');
  3. $wynik1 = mysql_query('SELECT FROM a');
  4. $wynik2 = mysql_query('SELECT FROM b');
  5.  
  6. if(($wynik)and($wynik2))
  7. {
  8.  mysql_query('COMMIT');
  9. }
  10. else
  11.  mysql_query('ROLLBACK');
  12. ?>


bardzo skrótowo, ale teraz rozumiesz idee?
batman
W Transakcjach chodzi o to, że jeśli jakieś zapytanie jest niepoprawne, wówczas wszystkie zamiany wprowadzone przez inne zapytania zostaną cofnięte. Ale by to zadziałało musisz użyć funkcji rollback. Jesli wszystkie zapytania zostały poprawnie wykonane, wówczas stosuje się funkcje commit. Po wykonaniu commit nie można cofnąć zmian, jakie miały miejsce podczas wykonywania transakcji.
Kamil J.
Dzięki za odpowiedzi.

@batman Czyli to działa tylko w jedną stronę, tak:

jeśli w zap2 jest błąd, to cofa zap1

a nie działa gdy:

w zap1 jest błąd, to nie wykona zap2.


Dobrze rozumiem?
Mi się zdaje, że tak powinno być, bo powiedzmy, że w zap1 tworzę użytkownika, a w zap2 dodaje go do grupy. Więc nie powinno być tak, że jeśli nie może dodać usera, to go nie dodaje do grupy? Dziwne sadsmiley02.gif

Pozdrawiam, Kamil
batman
Cytat
Dobrze rozumiem?
Mi się zdaje, że tak powinno być, bo powiedzmy, że w zap1 tworzę użytkownika, a w zap2 dodaje go do grupy. Więc nie powinno być tak, że jeśli nie może dodać usera, to go nie dodaje do grupy?


Dobrze rozumiesz. Jeśli w jakimkolwiek zapytaniu jest błąd, wówczas efekt działania wszystkich zapytań jest cofany.
Kamil J.
W takim razie odwołuje się do mojego pierwszego posta. Przypominam - mam tam używając adodb zap1, i zap2. W zap1 jest błąd, lecz mimo tego zap2 jest wykonywane. Dlaczego? Coś z tymi Smart Trans jest w adodb?

Pozdrawiam
batman
Poczytałem to co w linku podałeś i szczerze mówiąc, nie wiem dlaczego tak się dzieje. A sprawdzałeś czy działa stara metoda?

Cytat
The old way of doing transactions required you to use

$conn->BeginTrans();
$ok = $conn->Execute($sql);
if ($ok) $ok = $conn->Execute($sql2);
if (!$ok) $conn->RollbackTrans();
else $conn->CommitTrans();


Możliwe, że jest jakiś babol w tej bibliotece.
ikioloak
Nie sadze zeby byl babol w ADODB. Z jakiej bazy danych korzystasz? Czy na pewno obslugje transakcje? Pamietaj ze jesli chcesz korzystac z transakcji w mysql tabele musza byc ustawione na InnoDB a nie na MyISAM
Kamil J.
Witam, przepraszam, że dopiero teraz odpowiadam, ale sprawy wyższe.


Starym sposobem też nie chce działać, czyli coś u mnie źle.

  1. <?php
  2.  
  3. $cfg = array();
  4. $cfg['db'] = "mysql";
  5. $cfg['db_name'] = 'portal';
  6. $cfg['db_user'] = 'root';
  7. $cfg['db_pass'] = 'haslo';
  8. $cfg['db_host'] = 'localhost';
  9.  
  10. require_once("../core/libs/adodb/adodb.inc.php");
  11.  
  12. $db = NewADOConnection($cfg['db']);
  13. @$db->Connect($cfg['db_host'], $cfg['db_user'], $cfg['db_pass'], $cfg['db_name']);
  14.  
  15.  
  16.  
  17.  
  18. $sql = "update tabela set value = 'zmieniona1' where id = 1";
  19.  
  20.  
  21. $sql2 = "update tabela se value = 'zmieniona2' where id = 2";
  22.  
  23.  
  24.  
  25.  
  26.  
  27. $db->BeginTrans();
  28. $ok = $db->Execute($sql);
  29. if ($ok) $ok = $db->Execute($sql2);
  30. if (!$ok) $db->RollbackTrans();
  31. else $db->CommitTrans();
  32.  
  33.  
  34. ?>


Moje MySQL: 5.0.24, chyba powinien obsługiwać transakcje (zestaw WebServ)

Tabele używam InnoDB do tego.

Chyba, że coś źle rozumiem. Czy transakcje powinny reagować na błędy w składni zapytania?

Proszę o pomoc i z góry dziękuję.
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-2024 Invision Power Services, Inc.