Пример транзакций в mongodb с GoLang

Мне нужен пример для реализации транзакций в MongoDB с помощью GoLang.

Я использую этот драйвер golang для mongodb

https://github.com/mongodb/mongo-go-драйвер

Нет четкой документации по реализации транзакций.

Может кто-нибудь помочь мне?

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
9
0
10 006
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это может сбивать с толку. Ниже приведен простой пример.

if session, err = client.StartSession(); err != nil {
    t.Fatal(err)
}
if err = session.StartTransaction(); err != nil {
    t.Fatal(err)
}
if err = mongo.WithSession(ctx, session, func(sc mongo.SessionContext) error {
    if result, err = collection.UpdateOne(sc, bson.M{"_id": id}, update); err != nil {
        t.Fatal(err)
    }
    if result.MatchedCount != 1 || result.ModifiedCount != 1 {
        t.Fatal("replace failed, expected 1 but got", result.MatchedCount)
    }

    if err = session.CommitTransaction(sc); err != nil {
        t.Fatal(err)
    }
    return nil
}); err != nil {
    t.Fatal(err)
}
session.EndSession(ctx)

Вы можете просмотреть полный примеры здесь.

Это мне очень помогло. Спасибо и за уроки.

Sreenath 29.01.2019 12:25

относится к более старому вопросу, касающемуся транзакции, но для массовой записи: stackoverflow.com/questions/53621036/…

Wan Bachtiar 05.02.2019 00:09

в чем разница между сеансом и транзакцией?

Cirelli94 15.09.2020 09:54

@Cirelli94 docs.mongodb.com/manual/core/transactions/…

Muhammad Tariq 10.02.2021 14:08

Это поможет вам

ctx := context.Background()
client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
if err != nil {
    panic(err)
}

db := client.Database("testdb")
defer db.Client().Disconnect(ctx)
col := db.Collection("testcol")

// transaction
err = db.Client().UseSession(ctx, func(sessionContext mongo.SessionContext) error {
    err := sessionContext.StartTransaction()
    if err != nil {
        return err
    }

    _, err = col.InsertOne(sessionContext, bson.M{"_id": "1", "name": "berry"})
    if err != nil {
        return err
    }

    _, err = col.InsertOne(sessionContext, bson.M{"_id": "2", "name": "gucci"})
    if err != nil {
        sessionContext.AbortTransaction(sessionContext)
        return err
    }
    if err = session.CommitTransaction(sessionContext); err != nil {
        return err
    }
    return nil
})

Почему вы прерываете транзакцию только в случае сбоя второй операции, а также в случае ошибки первой операции? @berryberry

Aayush Taneja 29.08.2019 19:20

Я согласен с вашей точкой зрения @AayushTaneja, но тогда нам придется использовать предложение if else каждый раз, когда мы взаимодействуем с базой данных, ИЛИ нам просто нужно использовать CommitTransaction в последней строке? Я думаю, нам просто нужно CommitTransaction в последней строке. Пожалуйста, поправьте меня

Muhammad Tariq 11.02.2021 05:41

Другие вопросы по теме