Mongo使用事务报错

问题

当我们在使用事务的时候会出现 This MongoDB deployment does not support retryable writes. Please add retryWrites=false to your connection string.提示,在网上搜索大多数的结果是根据提示在连接的参数加上retryWrites=false,而我也是这么做的,然而并没有软用。

This MongoDB deployment does not support retryable writes. Please add retryWrites=false to your connection string.

原因

后来发现单节点mongo是不支持事务的,所以需要配置mongo副本集。配置副本集我好像没有传上来如果需要,我再传吧,或者去参考他人的文章。

解决方法

  • 1、如果你的mongo不是单节点,配置上提示的参数即可。
  • 2、如果是单节点,就配置副本集。

配置完副本集的mongo如何连接

MongoDB副本集只有Primary节点具有写数据的能力,当副本集中Primary节点宕机,或者副本集本身轮转升级时,副本集会触发选举,选出一个新的primary,原Primary节点则会降级成secondary。
当客户端连接副本集时,如果以primary地址连接实例,当发生上述情况时,,客户端将无法继续执行写操作。为了解决这一问题,连接时,最好使用副本集方式连接。
?replicaSet=rs0为副本集的名称

def client(self, db):
    # motor
    self.motor_uri = 'mongodb://{account}{hostport0},{hostport1},{hostport2}/{database}?replicaSet=rs0'.format(
        account='{username}:{password}@'.format(
            username=self.MONGODB['MONGO_USERNAME'],
            password=self.MONGODB['MONGO_PASSWORD'])
        if self.MONGODB['MONGO_USERNAME'] else '',
        hostport0=self.MONGODB['MONGOHOST_PORT'][0] if self.MONGODB['MONGOHOST_PORT'] else 'localhost:27017',
        hostport1=self.MONGODB['MONGOHOST_PORT'][1] if self.MONGODB['MONGOHOST_PORT'] else 'localhost:27016',
        hostport2=self.MONGODB['MONGOHOST_PORT'][2] if self.MONGODB['MONGOHOST_PORT'] else 'localhost:27015',
        # host=self.MONGODB['MONGO_HOST'] if self.MONGODB['MONGO_HOST'] else 'localhost',
        # port=self.MONGODB['MONGO_PORT'] if self.MONGODB['MONGO_PORT'] else 27017,
        database=db)
    print(self.motor_uri)
    return AsyncIOMotorClient(self.motor_uri, retryWrites=False, io_loop=self.loop, tz_aware=True,
                              tzinfo=pytz.timezone('Asia/Shanghai'))
根据提供的引用内容,出现`Authentication failed`错误可能是由于以下原因之一: 1.用户名或密码错误。 2.连接的数据库不正确。 3.用户没有连接到指定数据库的权限。 为了解决这个问题,你可以尝试以下几个步骤: 1.确保你的用户名和密码是正确的,并且你正在连接到正确的数据库。你可以通过在终端中使用以下命令来验证你的用户名和密码是否正确: ```shell mongo --username your_username --password your_password --authenticationDatabase your_database ``` 2.如果你的用户名和密码是正确的,但是你仍然无法连接到数据库,请确保你的用户有连接到指定数据库的权限。你可以使用以下命令来检查你的用户是否有连接到指定数据库的权限: ```shell use your_database db.getUser("<username>") ``` 如果你的用户没有连接到指定数据库的权限,你可以使用以下命令为用户授予连接到指定数据库的权限: ```shell use your_database db.grantRolesToUser("<username>", [{role: "<role_name>", db: "<database_name>"}]) ``` 其中,`<role_name>`是你想要授予的角色名称,`<database_name>`是你想要授予权限的数据库名称。 3.如果你的用户名和密码是正确的,并且你的用户有连接到指定数据库的权限,但是你仍然无法连接到数据库,请确保你的IP地址已经被授权访问数据库。你可以使用以下命令来检查你的IP地址是否已经被授权访问数据库: ```shell use your_database db.runCommand({connectionStatus : 1}) ``` 如果你的IP地址没有被授权访问数据库,你可以使用以下命令为你的IP地址授权访问数据库: ```shell use your_database db.runCommand({grantRolesToUser: "<username>", roles: [{role: "<role_name>", db: "<database_name>"}], "authenticationRestrictions": [{"clientSource": ["<ip_address>"]}]}) ``` 其中,`<ip_address>`是你想要授权的IP地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值