Naprawdę nie znalazłem normalnego przykładu pliku PHP, w którym używane są transakcje MySQL. Czy możesz mi pokazać prosty przykład?
I jeszcze jedno pytanie. Już dużo programowałem i nie korzystałem z transakcji. Czy mogę wstawić funkcję PHP lub coś w header.php
tym stylu, jeśli jedna mysql_query
zawiedzie, to pozostałe też zawiodą?
Myślę, że to rozgryzłem, prawda ?:
mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
$a1 = mysql_query("INSERT INTO rarara (l_id) VALUES('1')");
$a2 = mysql_query("INSERT INTO rarara (l_id) VALUES('2')");
if ($a1 and $a2) {
mysql_query("COMMIT");
} else {
mysql_query("ROLLBACK");
}
php
mysql
transactions
dobry wieczór
źródło
źródło
mysql_query("BEGIN");
Zamiast sekwencji można użyćmysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
mysql_*
funkcji w nowym kodzie . Nie są już utrzymywane i oficjalnie przestarzałe . Widzisz czerwone pole ? Dowiedz sięzamiast tegoo przygotowanych instrukcjach i użyj PDO lub MySQLi - ten artykuł pomoże ci zdecydować, które. Jeśli wybierzesz PDO, oto dobry tutorial .mysql
mimo że jest przestarzały, będzie dostępny w PECL na zawsze.mysql
Odpowiedzi:
Pomysł, którego zwykle używam podczas pracy z transakcjami, wygląda następująco (pół-pseudo-kod) :
Zauważ, że przy tym pomyśle, jeśli zapytanie nie powiedzie się, należy zgłosić wyjątek:
PDO::setAttribute
PDO::ATTR_ERRMODE
iPDO::ERRMODE_EXCEPTION
Niestety nie ma w tym żadnej magii. Nie możesz po prostu gdzieś umieścić instrukcji, a transakcje są wykonywane automatycznie: nadal musisz określić, która grupa zapytań musi zostać wykonana w transakcji.
Na przykład dość często będziesz mieć kilka zapytań przed transakcją (przed
begin
) i kolejne kilka zapytań po transakcji (po jednymcommit
lub drugimrollback
) i będziesz chciał, aby te zapytania były wykonywane bez względu na to, co się stało (lub nie) w transakcja.źródło
$db
tutaj typ? mysqli?PDOException
a nawet sprawdzać wartości wyjątków, jeśli to konieczne. us2.php.net/PDOExceptionMyślę, że to rozgryzłem, prawda ?:
źródło
źródło
Ponieważ jest to pierwszy wynik w Google dotyczący „transakcji php mysql”, pomyślałem, że dodam odpowiedź, która wyraźnie pokazuje, jak to zrobić za pomocą mysqli (tak jak chciał tego oryginalny autor). Oto uproszczony przykład transakcji z PHP / mysqli:
Pamiętaj również, że PHP 5.5 ma nową metodę mysqli :: begin_transaction . Jednak nie zostało to jeszcze udokumentowane przez zespół PHP i nadal tkwię w PHP 5.3, więc nie mogę tego komentować.
źródło
$conn->autocommit(FALSE)
w powyższym przykładzie wpływa tylko na indywidualne połączenie - nie ma wpływu na żadne inne połączenia z bazą danych.if (!result)
, powinien zrobićif (result === false)
, jeśli zapytanie jest w stanie zwrócić poprawny wynik, którego wynikiem byłoby false lub zero.Sprawdź, którego silnika pamięci używasz. Jeśli jest to MyISAM,
Transaction('COMMIT','ROLLBACK')
nie będzie obsługiwany, ponieważ tylko silnik pamięci InnoDB, a nie MyISAM, obsługuje transakcje.źródło
Podczas korzystania z połączenia PDO:
Często używam następującego kodu do zarządzania transakcjami:
Przykład użycia:
W ten sposób kod zarządzania transakcjami nie jest duplikowany w całym projekcie. Co jest dobre, ponieważ sądząc po innych odpowiedziach powiązanych z PDO w tym wątku, łatwo jest popełnić w nim błędy. Najczęstsze to zapominanie o ponownym zwrocie wyjątku i rozpoczęcie transakcji w
try
bloku.źródło
Zrobiłem funkcję, aby uzyskać wektor zapytań i wykonać transakcję, może ktoś uzna to za przydatne:
źródło
Miałem to, ale nie jestem pewien, czy to prawda. Mógłbym również to wypróbować.
Pomysł stąd: http://www.phpknowhow.com/mysql/transactions/
źródło
mysql_query
, zamiast używaćmysqli
, nawet jeśli link do samouczka, który używamysqli
. IMHO, powinieneś albo usunąć ten zły przykład, albo zastąpić go, aby użyć kodu zapisanego w samouczku phpknowhow.Jeszcze jeden przykład stylu proceduralnego z
mysqli_multi_query
, zakłada, że$query
jest wypełniony instrukcjami oddzielonymi średnikami.źródło
mysqli_multi_query
. Każdy zainteresowany powinien google gdzie indziej w celu uzyskania czystszego przykładu.