Als u de PHP-bibliotheek gebruikt die de driver omhult, na het maken van een instantie van Client
bijv. genaamd $client
, kunt u het volgende doen:
$session = $client->startSession();
$session->startTransaction();
try {
// Perform actions.
$session->commitTransaction();
} catch(Exception $e) {
$session->abortTransaction();
}
Helaas kon ik geen relevante documentatie vinden in de PHP-bibliotheekreferentie na een vluchtige zoekopdracht, maar ik vond voorbeelden in de problemen met de PHP-bibliotheek die suggereren dat het creëren van een sessie van de klant en het gebruiken van die sessie om de transactie te starten en vervolgens de transactie vast te leggen of af te breken, de juiste procedure is.
Er zijn echter een paar dingen waar u op moet letten:
-
De $session-variabele moet worden doorgegeven in een aparte parameter . D.w.z. als u
insertOne(['abc' => 1])
. wilt uitvoeren in een sessie heb jeinsertOne(['abc' => 1], ['session' => $session])
nodig . Als u dit niet doet, worden de bewerkingen nog steeds uitgevoerd, maar maken ze geen deel uit van de sessie - d.w.z. als u de sessie later terugdraait, worden ze niet ongedaan gemaakt. -
Transacties zijn alleen beschikbaar als je een replicaset hebt geconfigureerd . In dit stadium ondersteunt MongoDB geen transacties op een zelfstandige server.
Als u de MongoDB-documenten bekijkt (zoals hierboven gelinkt), ziet u dat de vereiste voor een replicaset om in gebruik te zijn niet bijzonder prominent wordt weergegeven, onder de derde kop staat en na alle voorbeeldcode komt (die, als je op mij lijkt, zal het eerste zijn waar je naar zoekt).