gpt4 book ai didi

php - 使用新的 PHP 驱动程序在 MongoDB 4.2 中进行事务

转载 作者:行者123 更新时间:2023-12-04 10:22:00 28 4
gpt4 key购买 nike

我是新来的 MongoDB因为我是 MySQL 的 super 粉丝前。我最近搬到了这个 NoSQL东西并喜欢它,但现在我被严重困在 交易 MongoDB .

我在 SO 上发现了一些相关问题,但没有答案或已过时,不适用于新的 MongoDB PHP Driver因为语法/函数有很多变化,我可以看到很多像我这样的新手在 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,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

我的问题是,如何使用 New PHP Driver 的函数更新上述代码?我相信使用
MongoDB\Driver\Manager::startSession
MongoDB\Driver\Session::startTransaction
MongoDB\Driver\Session::commitTransaction

但由于文档不完整且没有示例,我不明白他们的语法或参数等。感谢您期待您的时间和支持。

最佳答案

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

使用 核心 Mongo 扩展

$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();
}

注:为了使答案简明扼要,我省略了一些可选参数并使用了虚拟插入数据等,而没有任何 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/

关于php - 使用新的 PHP 驱动程序在 MongoDB 4.2 中进行事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60809844/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com