Se stai utilizzando la libreria PHP che esegue il wrapping del driver, dopo aver creato un'istanza di Client
per esempio. chiamato $client
, puoi fare quanto segue:
$session = $client->startSession();
$session->startTransaction();
try {
// Perform actions.
$session->commitTransaction();
} catch(Exception $e) {
$session->abortTransaction();
}
Sfortunatamente non sono riuscito a trovare alcuna documentazione pertinente nel riferimento alla libreria PHP dopo una ricerca superficiale, ma ho trovato esempi nei problemi della libreria PHP ciò suggerisce che la creazione di una sessione dal client e l'utilizzo di tale sessione per iniziare, quindi eseguire il commit o l'interruzione della transazione è la procedura appropriata.
Tuttavia, un paio di cose da tenere a mente:
-
La variabile $session deve essere passata in un parametro separato . Cioè. se vuoi eseguire
insertOne(['abc' => 1])
in una sessione, avrai bisogno diinsertOne(['abc' => 1], ['session' => $session])
. Se non esegui questa operazione, le operazioni verranno comunque eseguite, ma non faranno parte della sessione, ovvero se in seguito esegui il rollback della sessione, non verranno annullate. -
Le transazioni sono solo disponibile se hai configurato un set di repliche . In questa fase MongoDB non supporta le transazioni su un server autonomo.
Se visualizzi i documenti MongoDB (come collegato sopra) noterai che il requisito per un set di repliche da utilizzare non è visualizzato in modo particolarmente evidente, essendo nella terza intestazione e dopo tutto il codice di esempio (che, se sei come me, sarà la prima cosa che cercherai).