I've read the online php manual but I'm still not sure of the way these two functions work: mysqli::commit & mysqli::rollback.
The first thing I have to do is to:
$mysqli->autocommit(FALSE);
Then I make some queries:
$mysqli->query("...");
$mysqli->query("...");
$mysqli->query("...");
Then I commit the transaction consisting of these 3 queries by doing:
$mysqli->commit();
BUT in the unfortunate case in which one of these queries does not work, do all 3 queries get cancelled or do I have to call a rollback myself? I want all 3 queries to be atomic and be considered as only one query. If one query fails then all 3 should fail and have no effect.
I'm asking this because in the comments I've seen on the manual page: http://php.net/manual/en/mysqli.commit.php the user Lorenzo calls a rollback if one of the queries failed.
What's a rollback good for if the 3 queries are atomic? I don't understand.
EDIT: This is the code example I am doubtful about:
<?php
$all_query_ok=true; // our control variable
$mysqli->autocommit(false);
//we make 4 inserts, the last one generates an error
//if at least one query returns an error we change our control variable
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (200)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (300)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false; //duplicated PRIMARY KEY VALUE
//now let's test our control variable
$all_query_ok ? $mysqli->commit() : $mysqli->rollback();
$mysqli->close();
?>
I think this code is wrong because if any of the queries failed and $all_query_ok==false
then you don't need to do a rollback because the transaction was not processed. Am I right?