Транзакция в MongoDB 4.2 с новым PHP драйвером - PullRequest
0 голосов
/ 23 марта 2020

Я новичок в MongoDB, так как раньше я был суперфаном MySQL. Я недавно перешел на эту NoSQL вещь и мне это нравилось, но теперь я попал в ловушку на Транзакциях в MongoDB.

Я нашел несколько связанных вопросов по SO, но без ответов или устарел который не работает с новым MongoDB PHP Driver, так как в синтаксисе / функциях есть много изменений, и я мог видеть, что многие newb ie, подобные мне, путаются между MongoDB Docs и PHP Driver.

Я нашел этот путь совершения транзакций в MongoDB Docs

$client = new MongoDB\Driver\Manager("mongodb://127.0.0.1:27017");
$callback = function (\MongoDB\Driver\Session $session) use ($client) 
{
    $client->selectCollection('mydb1', 'foo')->insertOne(['abc' => 1], ['session' => $session]);
    $client->selectCollection('mydb2', 'bar')->insertOne(['xyz' => 999], ['session' => $session]);
};

// Step 2: Start a client session.
$session = $client->startSession();

// Step 3: Use with_transaction to start a transaction, execute the callback, and commit

$transactionOptions = 
[
   'readConcern' => new \MongoDB\Driver\ReadConcern(\MongoDB\Driver\ReadConcern::LOCAL),
   'writeConcern' => new \MongoDB\Driver\WriteConcern(\MongoDB\Driver\WriteConcern::MAJORITY, 1000),
   'readPreference' => new \MongoDB\Driver\ReadPreference(\MongoDB\Driver\ReadPreference::RP_PRIMARY),
];

\MongoDB\with_transaction($session, $callback, $transactionOptions);

, но этот синтаксис / функции устарел для нового PHP драйвера и выдает следующую ошибку

Call to undefined function MongoDB\with_transaction()

Согласно PHP Docs, Новый PHP Драйвер для MongoDB предоставляет эти опции для фиксации транзакции, но я не понимаю, как? потому что в документах нет примеров.

https://www.php.net/manual/en/mongodb-driver-manager.startsession.php

https://www.php.net/manual/en/mongodb-driver-session.starttransaction.php

https://www.php.net/manual/en/mongodb-driver-session.committransaction.php

Мой вопрос: как я могу обновить вышеуказанный код с помощью новых PHP функций драйвера? Я считаю, что нужно использовать

MongoDB\Driver\Manager::startSession
MongoDB\Driver\Session::startTransaction
MongoDB\Driver\Session::commitTransaction 

, но я не понимаю, каков их синтаксис или их аргументы и т. Д. c из-за неполной документации и отсутствия примеров. Благодарю вас в ожидании вашего времени и поддержки.

1 Ответ

0 голосов
/ 23 марта 2020

Хорошо, я нашел ответ на свой вопрос и подумал, что он может быть полезен для некоторых других

с использованием Core Mon go Extension

$connection =  new MongoDB\Driver\Manager("mongodb://127.0.0.1:27017");

$session = $connection->startSession();
$session->startTransaction();

$bulk = new MongoDB\Driver\BulkWrite(['ordered' => true]);
$bulk->insert(['x' => 1]);
$bulk->insert(['x' => 2]);
$bulk->insert(['x' => 3]);
$result = $connection->executeBulkWrite('db.users', $bulk, ['session' => $session]);

$session->commitTransaction();

с использованием PHP Библиотека

$session = $client->startSession();
$session->startTransaction();
try {
    // Perform actions.
    //insertOne(['abc' => 1], ['session' => $session]); <- Note Session
    $session->commitTransaction();
} catch(Exception $e) {
   $session->abortTransaction();
}

Примечание: Чтобы сделать ответ кратким и конкретным, я опустил некоторые дополнительные параметры и использованные фиктивные данные вставки и т. д. c без какой-либо попытки.


Если вы используете MongoDB экземпляр в качестве автономной версии, предназначенной для разработки или тестирования, то вы можете получить ошибку, например,

transaction numbers are only allowed on a replica set member or mongos

Затем вы можете включить реплику на автономном экземпляре, следуя этому руководству https://docs.mongodb.com/manual/tutorial/convert-standalone-to-replica-set/

...