登录
首页 >  Golang >  Go问答

无法使用 mongo go 驱动程序使用 mongodb 事务

来源:stackoverflow

时间:2024-04-27 21:18:34 224浏览 收藏

从现在开始,努力学习吧!本文《无法使用 mongo go 驱动程序使用 mongodb 事务》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

问题内容

我已经创建了一个 mongodb 副本集。我能够从 mongo shell 运行事务。但是当我尝试使用 mongo-go-driver 执行此操作时,我总是收到此错误 (illegaloperation) 事务编号仅允许在副本集成员或 mongos 上。我不确定我哪里出错了。我使用这个作为参考https://github.com/simagix/mongo-go-examples/blob/master/examples/transaction_test.go

我像这样创建客户端

client, err := mongo.newclient(options.client().applyuri("mongodb://localhost:27017,localhost:27018,localhost:27019?replicaset=rs"))

我可以连接到各个 mongodb 实例,但不能连接到副本集。 这是我正在尝试运行的事务

var session mongo.Session

coll := db.Collection("collectionname")

if session, err = client.StartSession(); err != nil {
    return "", fmt.Errorf("Could not start session: %q", err)
}

if err = session.StartTransaction(); err != nil {
    return "", fmt.Errorf("Could not start Transaction: %q", err)
}

if err = mongo.WithSession(ctx, session, func(sc md.SessionContext) error {

    newVal, err = coll.InsertOne(sc, val) // some val that I have
    if err != nil {
        sc.AbortTransaction(sc)
        return fmt.Errorf("Error during New address creation, aborting: %q", err)
    }

    if err = sc.CommitTransaction(sc); err != nil {
        return fmt.Errorf("Error While commiting New address Transaction: %q", err)
    }
    return nil
}); err != nil {
    return "", err
}

session.EndSession(ctx)

我有什么遗漏的吗?还有其他例子可以供我参考吗?感谢您的帮助/建议。


解决方案


这是您的连接代码的问题 - 很可能不是您的事务实现的问题。尝试使用更现代的连接字符串来连接到副本集:

connectionString := "mongodb+srv://USERNAME:[email protected]/?retryWrites=true&w=majority"

var err error
Client, err = mongo.NewClient(options.Client().ApplyURI(ConnectionString))
if err != nil {
    log.Fatal(err)
}

今天关于《无法使用 mongo go 驱动程序使用 mongodb 事务》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>