亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 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 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號