W3docs

autocommit

Scopri la funzione mysqli_autocommit() in PHP per gestire le transazioni MySQLi con commit e rollback in modo sicuro.

Questo articolo tratta la funzione mysqli_autocommit() in PHP, che attiva o disattiva la modalità autocommit di MySQLi. Scoprirai cosa fa l'autocommit, sia la sintassi orientata agli oggetti che quella procedurale, e come combinarla con mysqli_commit() e mysqli_rollback() per eseguire transazioni sicure e atomiche.

Cosa significa autocommit

Una transazione è un gruppo di istruzioni SQL che devono avere successo tutte insieme o fallire tutte insieme. Per impostazione predefinita, MySQLi funziona in modalità autocommit: ogni singola istruzione è una transazione a sé e viene salvata (confermata) nel database nel momento in cui viene eseguita. Non è possibile annullarla in seguito.

mysqli_autocommit() consente di disattivare questo comportamento automatico. Una volta disabilitato l'autocommit, le istruzioni vengono mantenute in una transazione in sospeso finché non si decide cosa farne:

  • Chiama mysqli_commit() per rendere permanenti tutte le modifiche in sospeso.
  • Chiama mysqli_rollback() per scartarle, lasciando il database invariato.

Questo è ciò che rende possibili gli aggiornamenti "tutto o niente" — ad esempio, il trasferimento di denaro tra due conti dove sia il debito che il credito devono avere successo, o nessuno dei due.

Come usare la funzione mysqli_autocommit()

Usare la funzione mysqli_autocommit() è molto semplice. Basta chiamare la funzione e passare una connessione MySQLi valida e un valore boolean che rappresenta lo stato dell'autocommit.

Parametri:

  • connection (procedurale) / $mysqli (OOP): L'oggetto connessione MySQLi.
  • mode (bool): TRUE per abilitare l'autocommit, FALSE per disabilitarlo.

Valore restituito: Restituisce TRUE in caso di successo, FALSE in caso di fallimento.

Nota: MySQLi supporta sia la sintassi orientata agli oggetti che quella procedurale. Il metodo OOP è $mysqli->autocommit($mode); l'equivalente procedurale è mysqli_autocommit($mysqli, $mode). Entrambi fanno esattamente la stessa cosa — scegli lo stile già utilizzato nel tuo codebase. Consulta la panoramica di PHP MySQLi per ulteriori informazioni sui due stili.

Ecco un esempio di base che utilizza lo stile orientato agli oggetti:

Come usare la funzione mysqli_autocommit()

<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: " . $mysqli->connect_error;
    exit();
}

$mysqli->autocommit(FALSE);

$mysqli->query("INSERT INTO users (name, email) VALUES ('John', '[email protected]')");
$mysqli->query("UPDATE users SET name='John Doe' WHERE id=1");

$mysqli->commit();

$mysqli->autocommit(TRUE);

$mysqli->close();
?>

In questo esempio, creiamo un nuovo oggetto MySQLi e disabilitiamo l'autocommit chiamando la funzione autocommit() con argomento FALSE. Eseguiamo quindi due query per inserire e aggiornare i dati in una tabella users. Confermiamo la transazione chiamando la funzione commit() dell'oggetto MySQLi.

Riattiviamo poi l'autocommit chiamando la funzione autocommit() con argomento TRUE. Infine, chiudiamo la connessione MySQLi usando il metodo close() dell'oggetto MySQLi.

Sintassi procedurale

La stessa logica scritta in stile procedurale passa la connessione come primo argomento a ogni funzione:

<?php
$link = mysqli_connect("localhost", "username", "password", "database");
if (mysqli_connect_errno()) {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
    exit();
}

// Turn off autocommit so the statements form one transaction
mysqli_autocommit($link, FALSE);

mysqli_query($link, "INSERT INTO users (name, email) VALUES ('John', '[email protected]')");
mysqli_query($link, "UPDATE users SET name='John Doe' WHERE id=1");

mysqli_commit($link);          // make both changes permanent

mysqli_autocommit($link, TRUE); // restore default behavior
mysqli_close($link);
?>

Rollback in caso di errore

Il vero vantaggio di disabilitare l'autocommit è la possibilità di annullare una transazione parzialmente completata quando qualcosa va storto. L'esempio seguente racchiude due aggiornamenti correlati in una transazione e li annulla se una delle query fallisce, così il database non viene mai lasciato in uno stato parzialmente aggiornato:

<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: " . $mysqli->connect_error;
    exit();
}

$mysqli->autocommit(FALSE); // begin a transaction

$ok = $mysqli->query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$ok = $ok && $mysqli->query("UPDATE accounts SET balance = balance + 100 WHERE id = 2");

if ($ok) {
    $mysqli->commit();
    echo "Transfer completed.";
} else {
    $mysqli->rollback(); // discard both updates
    echo "Transfer failed and was rolled back.";
}

$mysqli->autocommit(TRUE);
$mysqli->close();
?>

Poiché l'autocommit è disattivato, nessun UPDATE viene salvato finché non viene chiamato commit(). Se la seconda query fallisce, rollback() annulla anche la prima, garantendo che il denaro non venga mai addebitato senza essere accreditato.

Uso avanzato

La funzione mysqli_autocommit() opera a livello di connessione. Quando si passa l'autocommit da FALSE a TRUE, MySQLi esegue automaticamente il commit di qualsiasi transazione in sospeso. Questo comportamento è utile quando si gestiscono più transazioni indipendenti in sequenza all'interno dello stesso script. Ecco un esempio:

Uso avanzato di PHP autocommit()

<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: " . $mysqli->connect_error;
    exit();
}

// Start and commit the first transaction
$mysqli->autocommit(FALSE);
$mysqli->query("INSERT INTO users (name, email) VALUES ('John', '[email protected]')");
$mysqli->commit();

// Start and commit the second transaction
$mysqli->autocommit(FALSE);
$mysqli->query("UPDATE users SET name='John Doe' WHERE id=1");
$mysqli->commit();

// Re-enable autocommit for subsequent queries
$mysqli->autocommit(TRUE);

$mysqli->close();
?>

In questo esempio, disabilitiamo l'autocommit ed eseguiamo una query INSERT. Quindi confermiamo esplicitamente la prima transazione. Successivamente, disabilitiamo di nuovo l'autocommit per avviare una seconda transazione, eseguiamo una query UPDATE e la confermiamo. Infine, riabilitiamo l'autocommit e chiudiamo la connessione MySQLi.

Conclusione

La funzione mysqli_autocommit() ti dà il controllo su quando MySQLi salva le tue modifiche. Disabilitala con FALSE per avviare una transazione, esegui le istruzioni, poi usa mysqli_commit() per renderle permanenti o mysqli_rollback() per scartarle. Questo schema è essenziale ogni volta che più istruzioni devono avere successo o fallire come un'unica unità. Riabilita sempre l'autocommit (o chiudi la connessione) quando hai finito, in modo che le query successive si comportino come previsto e i dati rimangano coerenti.

Pratica

Pratica
Cosa fa la modalità autocommit in PHP?
Cosa fa la modalità autocommit in PHP?
Was this page helpful?