Mongodb 是否可以运行事务mon local mongod v4.2.8
尝试在删除(Go)时运行事务时: 我得到以下信息(仅在本地,即使在更新之后(通过mongod-version验证版本)): 错误: 代码:未知 消息:(非法操作)事务号仅允许在副本集成员或mongos上使用Mongodb 是否可以运行事务mon local mongod v4.2.8,mongodb,go,transactions,Mongodb,Go,Transactions,尝试在删除(Go)时运行事务时: 我得到以下信息(仅在本地,即使在更新之后(通过mongod-version验证版本)): 错误: 代码:未知 消息:(非法操作)事务号仅允许在副本集成员或mongos上使用 它在Atlas上起作用,所以它只是一个与当地相关的问题 所以我的问题是: 是否可以运行事务mon local mongod v4.2.8 谢谢您需要运行副本集,但出于开发目的,您可以运行单节点副本集。您好!谢谢,但是你是如何做到这一点的呢?如果withTransaction api是由g
- 它在Atlas上起作用,所以它只是一个与当地相关的问题
谢谢您需要运行副本集,但出于开发目的,您可以运行单节点副本集。您好!谢谢,但是你是如何做到这一点的呢?如果withTransaction api是由go驱动程序实现的,那么你也应该使用它。您可以按照说明创建副本集,但仅配置一个节点,而不是3个。您需要运行副本集,但出于开发目的,可以运行单个节点副本集。您好!谢谢,但是你是如何做到这一点的呢?如果withTransaction api是由go驱动程序实现的,那么你也应该使用它。您可以按照说明创建副本集,但只配置一个节点,而不是3个节点。
func (dal *DAL) GetAndRemoveOneCode() (string, error) {
var session mongo.Session
var err error
var ctx = context.Background()
var result *mongo.DeleteResult
var codeContainer models.CodeContainer
var cursor *mongo.Cursor
for result == nil || result.DeletedCount != 1 {
var batchSize int32 = 1
pipeline := mongo.Pipeline{bson.D{{Key: "$sample", Value: bson.D{{Key: "size", Value: 1}}}}}
cursor, err = dal.mongodb.GetDatabase().Collection(collectionName).Aggregate(ctx, pipeline, &options.AggregateOptions{BatchSize: &batchSize})
if err != nil {
return "", err
}
for cursor.Next(ctx) {
// decode the document
if err := cursor.Decode(&codeContainer); err != nil {
return "", err
}
}
if session, err = dal.mongodb.GetDatabase().Client().StartSession(); err != nil {
return "", err
}
if err = session.StartTransaction(); err != nil {
return "", err
}
if err = mongo.WithSession(ctx, session, func(sc mongo.SessionContext) error {
if result, err = dal.mongodb.GetDatabase().Collection(collectionName).DeleteOne(sc, bson.D{{Key: "_id", Value: codeContainer.ID}}); err != nil {
return err
}
if result.DeletedCount != 1 {
return err
}
if err = session.CommitTransaction(sc); err != nil {
return err
}
return nil
}); err != nil {
return "", err
}
session.EndSession(ctx)
}
return codeContainer.Code, nil
}