使用GoLang

时间:2019-01-28 09:08:24

标签: mongodb go transactions

我需要一个示例来使用GoLang在MongoDB中实现事务。

我正在使用此golang驱动程序用于mongodb

https://github.com/mongodb/mongo-go-driver

没有清晰的文档说明如何实现交易。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:4)

这可能会令人困惑。下面是一个简单的示例。

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)

您可以查看完整的examples here

答案 1 :(得分:0)

这将为您提供帮助

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 {
        fmt.Println(err)
        return err
    }

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

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