Come iniziare e terminare la transazione in mysqli?

Per quanto ho capito la transazione inizia quando chiamiamo $mysqli->autocommit(FALSE); istruzione e termina dopo aver chiamato $mysqli->commit(); command come nell'esempio qui sotto.

 <?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 ?> 

Ho capito bene? In caso contrario, potresti correggermi, perché in realtà è la prima volta che uso le transactions nella vita reale.

Grazie.

Bene, secondo il php doc , hai ragione.

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

Nell'esempio sopra:

  • CREATE TABLE è autoimpegnato perché è il comportmento predefinito.
  • l' INSERT INTO non è autoimpegnato a causa del autocommit(FALSE)
  • DROP TABLE è autoimpegnato perché l' autocommit(FALSE) stato resettato da ->commit(); .

j0k ha principalmente ragione, tranne nella tabella di rilascio.

Il commit automatico non è triggersto con -> commit ()

Invece, DROP TABLE è una query DDL e le query DDL sono sempre implicitamente impegnate e impegnano tutto il lavoro precedentemente non impegnato.

Quindi, se non hai eseguito il commit del lavoro, la query DDL forzerebbe questo commit.

Pensi che il command "commit" commuti automaticamente l'autocommit su true? Il commento in php doc dice NO!

Preparare l'istruzione SQL ONCE, quindi eseguirla MORE VOLTE:

 <?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 $langs=['Bavarian','Schwabian']; // explicitly begin db transaction $Mysqli->begin_transaction(); // prepare statement for multiple inserts once $stmt=$Mysqli->prepare("INSERT INTO table(column) VALUES(?)"); // bind prepared statement with variable $lang $stmt->bind_param('s',$lang); // loop for inserting $langs arrays values foreach($langs as $lang) { //execute prep stat more times with new values 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(); ?>