2010-01-25 12 views
5

MY Platforma:PHP & MySQL: Prosty kod do realizacji transakcji - Commit & Wycofywanie

PHP & mySQL

moja sytuacja:

Staram się realizować transakcje wewnątrz mojego kodu . Próbowałem podążać za przykładami, ale to niewiele pomoże. Używam 3 zapytań i chciałem napisać transakcję w taki sposób, aby w przypadku niepowodzenia któregokolwiek z zapytań, cała transakcja powinna zostać wycofana. Byłbym wdzięczny za prosty, wydajny i nie-obiektowy kod PHP, aby osiągnąć ten cel. Z góry dziękuję.

mojego kodu PHP:

//db_res calls a custom function that performs a mysql_query on the query 
$res1 = db_res("SELECT c1, c2 FROM t1 WHERE c5 = 3"); 
$res2 = db_res("UPDATE t2 SET c1 = 5 WHERE c2 = 10"); 
$res3 = db_res("DELETE FROM t3 WHERE c1 = 20"); 

if($res1 && $res2 && $res3) 
{ 
//commit --- but how? 
} 
else 
{ 
//rollback --- but how? 
} 
+1

Prosta i DOSKONAŁA odpowiedź/przykład (try catch) została podana na to samo pytanie na http://stackoverflow.com/questions/2708237/php-mysql-transactions- przykłady muszą przeczytać, pokazuje DOKŁADNIE co robić w sposób jasny i proste warunki. –

+0

Sprawdź to http://dev.mysql.com/doc/refman/5.0/en/commit.html. To powinno skierować cię we właściwym kierunku. –

Odpowiedz

6

Musisz użyć mysqli extension aby skorzystać z tej funkcji.

Patrz: autocommit(), commit() i rollback()

<?php 
$link = mysqli_connect("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

/* disable autocommit */ 
mysqli_autocommit($link, FALSE); 

mysqli_query($link, "CREATE TABLE myCity LIKE City"); 
mysqli_query($link, "ALTER TABLE myCity Type=InnoDB"); 
mysqli_query($link, "INSERT INTO myCity SELECT * FROM City LIMIT 50"); 

/* commit insert */ 
mysqli_commit($link); 

/* delete all rows */ 
mysqli_query($link, "DELETE FROM myCity"); 

if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) { 
    $row = mysqli_fetch_row($result); 
    printf("%d rows in table myCity.\n", $row[0]); 
    /* Free result */ 
    mysqli_free_result($result); 
} 

/* Rollback */ 
mysqli_rollback($link); 

if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) { 
    $row = mysqli_fetch_row($result); 
    printf("%d rows in table myCity (after rollback).\n", $row[0]); 
    /* Free result */ 
    mysqli_free_result($result); 
} 

/* Drop table myCity */ 
mysqli_query($link, "DROP TABLE myCity"); 

mysqli_close($link); 
?> 
+0

@John Dziękuję za odpowiedź. Zbudowałem ponad 85% mojej aplikacji za pomocą mysql_query. Myślę, że będę musiał zmodyfikować moją aplikację i przerobić ją od zera, jeśli będę musiał użyć mysqli. Czy jest to możliwe w jakikolwiek sposób, aby zrobić to za pomocą mysql_query? Nie jestem zbyt pewien, że mogę przejść na mysqli w tym momencie, więc alternatywne rozwiązanie jest wysoko cenione. Oczekuję na Twoją odpowiedź. – Devner

+2

Niestety nie. funkcje mysql_ * nie oferują dostępu do zaawansowanych funkcji oferowanych przez MySQL 4 i późniejsze, takich jak transakcje i procedury przechowywane. Nie musisz wracać i zmieniać każdego połączenia z MySQL, aby używać mysqli. Po prostu zmień strony, które faktycznie będą z niego korzystać. –

+0

Spróbuję tego. Dziękuję Ci. – Devner

13

Nie trzeba używać mysqli. Możesz po prostu wydać polecenia transakcji jako zapytania.

Tak dla przykładu:

mysql_query("start transaction;"); 

//db_res calls a custom function that performs a mysql_query on the query 
$res1 = db_res("SELECT c1, c2 FROM t1 WHERE c5 = 3"); 
$res2 = db_res("UPDATE t2 SET c1 = 5 WHERE c2 = 10"); 
$res3 = db_res("DELETE FROM t3 WHERE c1 = 20"); 

if($res1 && $res2 && $res3) 
{ 
    mysql_query("commit;"); 
} 
else 
{ 
    mysql_query("rollback;"); 
} 

Przez one sposób, jeśli myślisz o uaktualnieniu do mysqli, proszę nie robić. Przejdź na PDO, to o wiele bardziej rozsądne.

+0

Myślę, że masz na myśli mysql_query ("start transaction"); lub mysql_query ("rozpocznij"); – Rooster242

+0

Tak, pomieszałem między tymi dwoma ... Naprawię. – rjmunro

+0

mysql nie jest bezpieczny, spróbuj użyć mysqli lub PDO – Asuquo12