Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Transakcje w ADODB
Kamil J.
post
Post #1





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 29.12.2005
Skąd: Łódź

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


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ź.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
wipo
post
Post #2





Grupa: Zarejestrowani
Postów: 856
Pomógł: 19
Dołączył: 30.08.2005
Skąd: 100lica

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


Nie se tylko set
Go to the top of the page
+Quote Post
Sabistik
post
Post #3


Administrator wortalu


Grupa: Przyjaciele php.pl
Postów: 960
Pomógł: 39
Dołączył: 21.10.2003
Skąd: Kraków

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


Przenoszę na gotowe skrypty.
Go to the top of the page
+Quote Post
Kamil J.
post
Post #4





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 29.12.2005
Skąd: Łódź

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


Cytat(wipo @ 16.12.2006, 10:03:55 ) *
Nie se tylko set


Wiem, przecież specjalnie zrobiłem ten błąd (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

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

pzdr
Go to the top of the page
+Quote Post
Fallout
post
Post #5





Grupa: Zarejestrowani
Postów: 154
Pomógł: 0
Dołączył: 17.12.2003
Skąd: Olsztyn

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


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?
Go to the top of the page
+Quote Post
batman
post
Post #6





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




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





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 29.12.2005
Skąd: Łódź

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


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 (IMG:http://forum.php.pl/style_emoticons/default/sadsmiley02.gif)

Pozdrawiam, Kamil
Go to the top of the page
+Quote Post
batman
post
Post #8





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




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.
Go to the top of the page
+Quote Post
Kamil J.
post
Post #9





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 29.12.2005
Skąd: Łódź

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


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
Go to the top of the page
+Quote Post
batman
post
Post #10





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




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





Grupa: Zarejestrowani
Postów: 416
Pomógł: 0
Dołączył: 8.01.2004

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


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
Go to the top of the page
+Quote Post
Kamil J.
post
Post #12





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 29.12.2005
Skąd: Łódź

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


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

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: 14.10.2025 - 10:30