我需要一个用GoLang实现MongoDB事务的示例。
我正在使用这个MongoDB的golang驱动程序:
https://github.com/mongodb/mongo-go-driver
目前还没有清晰的文档说明如何实现事务。
有人可以帮帮我吗?
我需要一个用GoLang实现MongoDB事务的示例。
我正在使用这个MongoDB的golang驱动程序:
https://github.com/mongodb/mongo-go-driver
目前还没有清晰的文档说明如何实现事务。
有人可以帮帮我吗?
这可能会让人感到困惑。以下是一个简单的例子。
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)
你可以查看完整的示例。这将有所帮助
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
})
if else
语句吗?还是只需要在最后一行使用 CommitTransaction
?我认为我们只需要在最后一行使用 CommitTransaction
。请纠正我。 - Muhammad TariqsessionContext.AbortTransaction(sessionContext)
应该是 sessionContext.AbortTransaction(context.Background())
确保即使传递给会话的上下文正在关闭或会话调用期间发生超时,中止也能完成。session.CommitTransaction(sessionContext)
-> sessionContext.CommitTransaction(context.Background())
。 - TopherGopher