web-dev-qa-db-fra.com

Comment démarrer et terminer une transaction dans mysqli?

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.

36
Bakhtiyor

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.
  • les INSERT INTO ne sont pas automatiquement validés à cause de la autocommit(FALSE).
  • le DROP TABLE est automatiquement validé car la autocommit(FALSE) était reset par la ->commit();.
26
j0k

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.

28
Bolovsky

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();

?>
12
sbrbot

Vous pensez que la commande "commit" remet automatiquement l'autocommit sur true? Commentaire dans doc php dit NON!

8
Patec