Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] transakcje (innodb)
Forum PHP.pl > Forum > Bazy danych > MySQL
lenczewski
cześć, doszedłem już że mysql (wersje starsze niż 5, nowsze niż 4.coś.tam) obsługuje transakcje ale w tabelach typu InnoDB. No i niby w porządku jednak...
Mamm dwie funkcje:
  1. <?php
  2. function connection()
  3. {
  4. global $conn;
  5. $conn = mysql_connect("localhost","root","krasnal") or die ("Błąd w połączeniu z bazą danych!");
  6. if (!$conn || !mysql_select_db("book",$conn))
  7. {
  8. return 0;
  9. } else {
  10. return $conn;
  11. }
  12. }
  13.  
  14. function sql($query)
  15. {
  16. if(!($conn = connection()))
  17. {
  18. return 0;
  19. } else {
  20. $result = mysql_query($query,$conn);
  21. if(!$result)
  22. {
  23. echo '<div class="ErrorStyle"><hr>Wystąpił błąd<br>[' . $query . ']<br>[' . mysql_error() . ']<hr></div>';
  24. } else {
  25. return $result;
  26. }
  27. }
  28. mysql_close($conn);
  29. }
  30. ?>

Czy moglibyście mi pomóc, żeby przerobić je tak, aby obsługiwały transakcje?
Nie chciałbym przerabiać wszystkich wywołań funkcji wiec wpadłem na pomysł, żeby transakcje wstawić w samej funkcji. Czy to dobre rozumowanie?
Adiasz
Zamiast kopiowac bezmyslnie czyjes skrypty i dawac je pozniej do przerobienia moglbys sie troche wysilic i poczytac cos o tranzkcjach skoro juz wiesz ze costam costam je obsluguje.
dr_bonzo
Jak mowil Adiasz: poczytaj o tranzakcjach, czym sa, jakie maja wlasciwosci, jak i kiedy sie je stosuje, to bedziesz wiedzial ze chcac w funkcji sql() zaimplementowac tranzakcje nie uzyskasz nic nowego -- kazde zapytanie bedzie OSOBNO w tranzakcji, czyli tak jak defaultowo dziala mysql (auto commit wszystkich zapytan).

W tranzakcje obejmuje sie zazwyczaj wiele (>1) zapytan (ale nikt nie zabrania robic tego dla 1go zapytania -- tylko to nie ma zadnych wlasciwosci tranzakcji) -- wiec i tak bedziesz musial caly kod przerobic.
lenczewski
czyli w sumie dla jednego zapytanie do bazy mogę z powodzeniem stosować funkcję SQL() (tą z przykładu powyżej)?

edit:
...a czy możecie odesłać mnie do jakiegoś rozsądnego przykładu (php + MySQL)?

add: 2006 05 01
napisałem coś takiego:
  1. <?php
  2. mysql_connect("localhost","root", "krasnal") or die(mysql_error());
  3.  
  4. @mysql_query("START TRANSACTION ");
  5.  
  6. $query = "INSERT INTO wpis (id, desc, who) values (11, 'ble ble ble', 'ble ble')";
  7. $result = @mysql_query($query);
  8. $query = "INSERT INTO wpis (id, desc, who) values (11, 'ble ble ble', 'ble ble')";
  9. $result = @mysql_query($query);
  10.  
  11. if(!$result) {
  12. @mysql_query("ROLLBACK");
  13. echo "bład";
  14. } else {
  15. @mysql_query("COMMIT");
  16. echo "dane dodane";
  17. }
  18. ?>
..i niby wszystko ładnie, jednak znalazłem problem jeżli błąd wyskoczy w nie ostatnim zapytaniu, np:
  1. <?php
  2. ....
  3. $query = "INSERT INTO wpis (id, desc, who) values (10, 'ble ble ble', 'ble ble')";
  4. $result = @mysql_query($query);
  5. $query = "INSERT INTO wpis (id, desc, who) values (10, 'ble ble ble', 'ble ble')";
  6. $result = @mysql_query($query);
  7. $query = "INSERT INTO wpis (id, desc, who) values (11, 'ble ble ble', 'ble ble')";
  8. $result = @mysql_query($query);
  9. ...
  10. ?>

czy można sprawdzić poprawność wykonania zapytań w inny, bardziej elastyczny sposób?

...i co się stanie jeżli serwer po drugim zapytaniu "padnie"? rzecz jasna że nie wykona się trzecie zapytanie, ale w jaki sposób wykona się ROLLBACK jeżli serwer nie odpowiada?
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.