簡體   English   中英

帶有C#的Mongo DB-添加文檔而不考慮事務

[英]Mongo DB with C# - document added regardless of transaction

我正在嘗試用我編寫的一個簡單示例測試Mongo DB中新支持的事務。 我正在將Mongo DB版本4.0.5與驅動程序版本2.8.1結合使用。 它只是一個沒有分片/副本的主實例。

我必須在以下代碼中缺少一些基本知識。 我創建一個Mongo客戶端,會話和數據庫,然后啟動一個事務,添加一個文檔並中止該事務。 在此代碼之后,我希望數據庫中沒有任何更改,但已添加了文檔。 調試時,我還可以使用Robo 3T(Mongo客戶端GUI)在InsertOne()之后看到文檔。

知道我想念什么嗎?

        var client =  new MongoClient("mongodb://localhost:27017");
        var session = client.StartSession();
        var database = session.Client.GetDatabase("myDatabase", new MongoDatabaseSettings
        {
            GuidRepresentation = GuidRepresentation.Standard,
            ReadPreference = ReadPreference.Primary,
            WriteConcern = new WriteConcern(1, 
                new MongoDB.Driver.Optional<TimeSpan?>(TimeSpan.FromSeconds(30))),

        });

        var entities = database.GetCollection<MyEntity>("test");            

        session.StartTransaction();

        // After this line I can already see the document in the db collection using Mongo client GUI (Robo 3T), although I expect not to see it until committing
        entities.InsertOne(new MyEntity { Name =  "Entity" });

        // This does not have any effect
        session.AbortTransaction();

編輯:

MongoDB可以作為1節點副本集運行,盡管我不確定獨立副本和1節點副本集有什么區別。 請參閱下面的我的帖子。

無論如何,要使用已啟動的事務,插入代碼必須將會話作為參數接收:

entities.InsertOne(session, new MyEntity { Name = "Entity" });

現在有了這兩個更改,交易就可以進行。

這本質上是MongoDB本身的屬性。 (更多在這里這里

事務僅在副本集設置中可用

為什么它不適用於獨立實例?

使用子文檔和數組,文檔數據庫(MongoDB)允許在單個數據結構內按層次結構統一相關數據。 可以使用原子操作來更新文檔,從而為它提供與關系數據庫中的多表事務相同的數據完整性保證。

我找到了一個解決方案,盡管不確定會帶來什么后果,也許有人可以指出:通過在mongod中簡單添加以下內容,似乎可以將Mongo DB用作1節點副本集(而不是獨立副本)。 cfg文件:

replication:
   replSetName: rs1

同樣,由於下面的鏈接,代碼應使用InsertOne()的正確重載,該重載將會話作為第一個參數接收(請參見原始文章的編輯內容):

使用mongodb 4.08社區服務器的c#中,多個文檔事務不起作用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM