Pour autant que j'ai compris, la transaction commence une fois que nous appelons l'instruction $mysqli->autocommit(FALSE);
et se termine après l'appel de la commande $mysqli->commit();
comme dans l'exemple ci-dessous.
<?php
//Start transaction
$mysqli->autocommit(FALSE);
$mysqli->query('UPDATE `table` SET `col`=2');
$mysqli->query('UPDATE `table1` SET `col1`=3;');
$mysqli->commit();
//End transaction
//Executing other queries without transaction control
$mysqli->query("Select * from table1");
$mysqli->query("Update table1 set col1=2");
//End of executing other queries without transaction control
//Start transaction
$mysqli->autocommit(FALSE);
$mysqli->query('UPDATE `table` SET `col`=2');
$mysqli->query('UPDATE `table1` SET `col1`=3;');
$mysqli->commit();
//End transaction
?>
Ai-je bien compris? Sinon, pourriez-vous me corriger, car c'est ma première utilisation de transactions dans la vie réelle.
Merci.
Eh bien, selon le doc php , vous avez raison.
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("CREATE TABLE Language LIKE CountryLanguage");
/* set autocommit to off */
$mysqli->autocommit(FALSE);
/* Insert some values */
$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F', 11.2)");
$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)");
/* commit transaction */
$mysqli->commit();
/* drop table */
$mysqli->query("DROP TABLE Language");
/* close connection */
$mysqli->close();
?>
Dans l'exemple ci-dessus:
CREATE TABLE
est automatiquement validé car il s'agit du comportement par défaut.INSERT INTO
ne sont pas automatiquement validés à cause de la autocommit(FALSE)
.DROP TABLE
est automatiquement validé car la autocommit(FALSE)
était reset par la ->commit();
.j0k a principalement raison, sauf dans le tableau déroulant.
La validation automatique n'est pas activée avec le -> commit ()
Au lieu de cela, DROP TABLE est une requête DDL et les requêtes DDL sont toujours implicitement validées et valideront tout votre travail précédemment non validé.
Donc, si vous n'avez pas validé le travail, la requête DDL forcerait cette validation.
Préparez l'instruction SQL UNE FOIS, puis exécutez-la PLUSIEURS fois:
<?php
$Mysqli = new mysqli("Host","user","pass","base");
// check connection
if(mysqli_connect_errno())
{
printf("Connect failed: %s\n",mysqli_connect_error());
exit();
}
// some data for db insertion
$countries=['Austria','Belgia','Croatia','Denmark','Estonia'];
// explicitly begin DB transaction
$Mysqli->begin_transaction();
// prepare statement (for multiple inserts) only once
$stmt=$Mysqli->prepare("INSERT INTO table(column) VALUES(?)");
// bind (by reference) prepared statement with variable $country
$stmt->bind_param('s',$country);
// load value from array into referenced variable $country
foreach($countries as $country)
{
//execute prep stat more times with new values
//$country is binded (referenced) by statement
//each execute will get new $country value
if(!$stmt->execute())
{
// rollback if prep stat execution fails
$Mysqli->rollback();
// exit or throw an exception
exit();
}
}
// close prepared statement
$stmt->close();
// commit transaction
$Mysqli->commit();
// close connection
$Mysqli->close();
?>
Vous pensez que la commande "commit" remet automatiquement l'autocommit sur true? Commentaire dans doc php dit NON!