使用新的PHP驱动程序在MongoDB 4.2中进行交易



我是MongoDB的新手,因为我以前是MySQL的超级粉丝。我最近转向了NoSQL,并很喜欢它,但现在我被MongoDB中的事务严重困住了。

我在SO上发现了一些相关的问题,但没有答案或过时,这与新的MongoDB PHP Driver不兼容,因为语法/函数有很多变化,我可以看到许多像我这样的新手在MongoDB Docs和PHP Driver之间感到困惑。

我在MongoDB Docs 中发现了这种提交事务的方法

$client = new MongoDBDriverManager("mongodb://127.0.0.1:27017");
$callback = function (MongoDBDriverSession $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 MongoDBDriverReadConcern(MongoDBDriverReadConcern::LOCAL),
'writeConcern' => new MongoDBDriverWriteConcern(MongoDBDriverWriteConcern::MAJORITY, 1000),
'readPreference' => new MongoDBDriverReadPreference(MongoDBDriverReadPreference::RP_PRIMARY),
];
MongoDBwith_transaction($session, $callback, $transactionOptions);

但对于新的PHP驱动程序来说,这种语法/函数已经过时了,它给出了以下错误

Call to undefined function MongoDBwith_transaction()

根据PHP文档,MongoDB的新PHP驱动程序提供了这些提交事务的选项,但我不明白怎么做?因为文档中没有给出示例。

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驱动程序的函数更新上面的代码?我相信要使用

MongoDBDriverManager::startSession
MongoDBDriverSession::startTransaction
MongoDBDriverSession::commitTransaction 

但我不明白他们的语法是什么,他们的论点等等,因为文档不完整,没有例子。感谢您的时间和支持。

好的,所以,我找到了我的问题的答案,我认为这对其他有帮助

使用核心Mongo扩展

$connection =  new MongoDBDriverManager("mongodb://127.0.0.1:27017");
$session = $connection->startSession();
$session->startTransaction();
$bulk = new MongoDBDriverBulkWrite(['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();
}

注意:为了使答案简明扼要,我省略了一些可选参数,并在没有任何try-catch的情况下使用了伪插入数据等


如果您将MongoDB实例作为用于开发或测试的独立版本运行,则可能会出现类似的错误

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

然后,您可以按照本指南在独立实例上启用副本https://docs.mongodb.com/manual/tutorial/convert-standalone-to-replica-set/

最新更新