4

我创建了一个 mongodb 副本集。我能够从 mongo shell 运行事务。但是当我尝试使用 mongo-go-driver 执行此操作时,我总是会收到此错误(IllegalOperation) Transaction numbers are only allowed on a replica set member or 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)

有什么我想念的吗。有没有其他的例子可以参考。感谢您的帮助/建议。

4

0 回答 0