golang mon go -db транзакция не может создать пространство имен - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь выполнить транзакцию db с помощью mon go -db in golang, но не могу создать ошибку пространства имен

    // For a replica set, include the replica set name and a seedlist of the members in the URI string; e.g.
    // uri := "mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017/?replicaSet=myRepl"
    // For a sharded cluster, connect to the mongos instances; e.g.
    // uri := "mongodb://mongos0.example.com:27017,mongos1.example.com:27017/"
    uri := "mongodb://mongo-0/block-recorder?replicaSet=rs0"
    // var uri string

    clientOpts := options.Client().ApplyURI(uri)
    client, err := mongo.Connect(ctx, clientOpts)
    if err != nil {
        panic(err)
    }
    defer func() { _ = client.Disconnect(ctx) }()

    // Prereq: Create collections.
    wcMajority := writeconcern.New(writeconcern.WMajority(), writeconcern.WTimeout(1*time.Second))
    wcMajorityCollectionOpts := options.Collection().SetWriteConcern(wcMajority)
    blockCollection := client.Database("block-recorder").Collection("Block", wcMajorityCollectionOpts)

    // Step 1: Define the callback that specifies the sequence of operations to perform inside the transaction.
    callback := func(sessCtx mongo.SessionContext) (interface{}, error) {
        // Important: You must pass sessCtx as the Context parameter to the operations for them to be executed in the
        // transaction.
        dbBlock := model.TransferBlockData(block)
        if _, err := blockCollection.InsertOne(sessCtx, dbBlock); err != nil {
            return nil, err
        }
        return nil, nil
    }

    // Step 2: Start a session and run the callback using WithTransaction.
    session, err := client.StartSession()
    if err != nil {
        panic(err)
    }
    defer session.EndSession(ctx)

    result, err := session.WithTransaction(ctx, callback)
    if err != nil {
        panic(err)
    }
    fmt.Printf("result: %v\n", result)

Это пример кода, который я использую, ошибка ниже

panic: multiple write errors: [{write errors: [{Cannot create namespace block-recorder.Block in multi-document transaction.}]}, {<nil>}]

Я использую gorm в большинстве случаев. Я впервые использую mon go с golang. В нем написано сначала создать коллекцию, что я уже делаю? Есть ли другой способ создания коллекции для mon go in golang? Как выполнить правильную транзакцию с примером данных структуры?

1 Ответ

0 голосов
/ 08 мая 2020

Сервер MongoDB в настоящее время не может создавать коллекции в транзакции.

Если ваше приложение, скажем, вставляет данные в несуществующую коллекцию, сервер в большинстве случаев прозрачно создает коллекцию. Но в настоящее время это не работает, если транзакция активна.

Создайте коллекцию заранее, чтобы она существовала к моменту выполнения транзакции.

Создание экземпляра объекта коллекции в вашем приложении делает на самом деле не создавать коллекцию. Чтобы создать коллекцию, попробуйте эквивалент createCollection в драйвере go.

...