为了账号安全,请及时绑定邮箱和手机立即绑定

使用 mongo-go-driver 和 Azure Cosmos DB 的事务的意外行为

使用 mongo-go-driver 和 Azure Cosmos DB 的事务的意外行为

Go
慕虎7371278 2022-05-18 16:52:13
我确定我遗漏了一些东西,但我无法让以下简单事务按预期工作。这种行为与我能找到的所有其他 SO 问题不同。下面的函数MultipleInsertsTransaction()灵感来自官方的例子。它成功写入一个文档,然后尝试写入第二个文档,但返回错误,因为再次(有意)使用了相同的 ID。我的理解是,这些文档都没有保存在数据库中,因为我们从来没有达到过sc.CommitTransaction(sc),所以里面的所有操作都StartTransaction()应该AbortTransaction()回滚,或者甚至对其他会话不可见。然而,事实并非如此。第一个文档写入,第二个按预期抛出错误,但是函数返回后,第一个文档被持久化在数据库中。这笔交易有什么问题?我错过了什么?或者这甚至是预期的?package mainimport (    "context"    "fmt"    "go.mongodb.org/mongo-driver/bson"    "go.mongodb.org/mongo-driver/bson/primitive"    "go.mongodb.org/mongo-driver/mongo"    "go.mongodb.org/mongo-driver/mongo/options"    "go.mongodb.org/mongo-driver/mongo/readconcern"    "go.mongodb.org/mongo-driver/mongo/writeconcern")const (    db = "test"    coll = "test")func main() {    client, _ := mongo.Connect(context.Background(), options.Client().ApplyURI("<put replica set connection string here>"))    want, _ := client.Database(db).Collection(coll).CountDocuments(context.Background(), bson.M{})    if err := MultipleInsertsTransaction(context.Background(), client); err != nil {        fmt.Println("expected error occured...")    }    got, _ := client.Database(db).Collection(coll).CountDocuments(context.Background(), bson.M{})    if got != want {        fmt.Printf("expected %d entries in database, but got %d", want, got)        return    }    fmt.Println("it worked!!")}func MultipleInsertsTransaction(ctx context.Context, client *mongo.Client) (err error) {    return client.UseSession(ctx, func(sc mongo.SessionContext) error {        err := sc.StartTransaction(options.Transaction().            SetReadConcern(readconcern.Snapshot()).            SetWriteConcern(writeconcern.New(writeconcern.WMajority())),        )        if err != nil {            return err        }}非常感谢!
查看完整描述

1 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

Azure CosmosDB 的 MongoDB API 仅与MongoDB Wire Protocol版本 3.6 兼容。它模拟与数据库的通信,核心数据库本身不是 MongoDB。

MongoDB 多文档事务是在 4.0 版(当前为 v4.2)上引入的。如果您使用的是支持事务和发送事务操作的 MongoDB 驱动程序,那么目前 CosmosDB 将不兼容它。根据您的用例,您可能会发现MongoDB Atlas很有用。


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信