MongoError:此MongoDB部署不支持可重试的写入。请在您的连接字符串中添加retryWrites = false


10

"mongoose": "^5.7.1"在Node.js项目中使用。我正在制作一个涉及两个文档更新的api。因此,我正在使用如下交易:

// Start the transaction
session = await mongoose.startSession()
session.startTransaction()

await Promise.all([
   <1st update operation>,
   <2nd update operation>
])

// Commit the transaction
session.commitTransaction()

在本地环境中点击此api时,出现以下错误:

MongoError:此MongoDB部署不支持可重试的写入。请在您的连接字符串中添加retryWrites = false。

当我在远程环境中点击此api时,它运行良好。我使用https://www.clever-cloud.com作为数据库云,使用AWS作为api云。

如错误消息中所写,我尝试将 retryWrites=false

  • 在我传递给猫鼬的连接字符串的末尾 mongodb://${ip}:${port}/${this.MONGO_DATABASE}?retryWrites=false
  • 带有retryWrites: false传递给该mongoose.connect方法的选项。
mongoose.connect(`mongodb://${ip}:${port}/${this.MONGO_DATABASE}`, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    retryWrites: false
  }, (err) => {...})

以上都不是解决问题的方法。

下面是mongo --version命令的输出:

db version v4.0.13
git version: bda366f0b0e432ca143bc41da54d8732bd8d03c0
allocator: system
modules: none
build environment:
    distarch: x86_64
    target_arch: x86_64

我调试并发现引发此错误的实际错误是:

MongoError:事务编号仅允许用于副本集成员或mongos

请提出一些建议。


我也开始看到这些错误。我在Heroku上使用Mlab。但是在客户端上添加选项解决了这个问题。我刚刚尝试了URI版本,它也可以正常工作。奇怪。
米格

我使用的是独立服务器,这会导致此错误。最初的错误不是实际的错误,以后的错误可以通过副本集或共享群集解决。参见npmjs.com/package/run-rs
Andro Developer

Answers:


2

无疑,事务是MongoDB 4.0中最令人兴奋的新功能。但是不幸的是,大多数用于安装和运行MongoDB的工具都启动了独立服务器,而不是副本集。如果您尝试在独立服务器上启动会话,则会收到此错误。

通过使用本地环境上的副本集可以解决此问题。

为此,我使用了运行程序


2

根据接受的答案中的建议,与独立服务器相反,您需要将本地服务器作为副本集运行以能够执行事务。

但是,除了建议的解决方案之外,您还可以按照MongoDB文档中的指示进行操作,而无需使用任何第三方工具,即可轻松地将Standalone本地db转换为副本集,概述如下:

  1. 停止您的独立mongod实例,然后使用replSet参数重新启动它。
mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost
  1. 使用mongo外壳连接到您的实例,然后启动新的副本集。
rs.initiate()

现在,您应该拥有一个副本集,而不是一个独立的mongodb服务器,您可以在其中在本地环境中执行事务以一次更新多个文档!

replSet每次启动服务器时,请不要忘记包含该参数,否则它将以独立模式启动。我只是使用与步骤1中相同的命令来再次运行它。


另外,您可以按照MongoDB文档中的其他说明从头部署新的副本集以测试环境


0

请编辑App/Config/database文件添加'retryWrites'=>false到Mongodb连接字符串

编写Mongo数据库连接

'mongodb' => [
            'driver'   => 'mongodb',
            'host'     => env('MONGO_DB_HOST', 'lo*****'),
            'port'     => *****,
            'database' => env('MONGO_DB_DATABASE'),
            'username' => env('MONGO_DB_USERNAME'),
            'password' => env('MONGO_DB_PASSWORD'),
            'options'  => [
                'database'=> env('MONGO_DB_DATABASE'),
                'retryWrites'=>false
            ]
        ],

保存并运行


0

请尝试添加&retryWrites=false到您的连接字符串

-

当连接到远程数据库服务器时,实际上是在OP中提到的错误,而该服务器在本地工作。在尝试错误提示之前,我联系了我们的mongo托管支持。

-

这就是我们的托管mongo网站(mLab)所说的:

您的应用程序的驱动程序可能已更新为尝试使用WiredTiger-only功能的更新版本。如错误所述,您需要在连接字符串中添加&retryWrites = false。

https://docs.mlab.com/faq/#why-am-i-getting-the-transaction-numbers-are-only-allowed-on-storage-engines-that-support-document-level-locking-error

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.