4
使用.NET MongoDB API(MongoDB.Driver),實現開放式併發控制的推薦方法是什麼?例如,是否有與SQL Server的ROWVERSION/TIMESTAMP類似的東西,例如,每次文檔更改時自動更新的屬性?或者是否有觸發機制?或者其他任何機制?使用.NET的MongoDB開放式併發控制
使用.NET MongoDB API(MongoDB.Driver),實現開放式併發控制的推薦方法是什麼?例如,是否有與SQL Server的ROWVERSION/TIMESTAMP類似的東西,例如,每次文檔更改時自動更新的屬性?或者是否有觸發機制?或者其他任何機制?使用.NET的MongoDB開放式併發控制
關於MongoDB中的樂觀併發沒有任何內置的內容。如果你需要,你需要自己實現。
您可以通過添加DateTime
時間戳,在執行更新之前對其進行讀取並將該時間戳用作更新過濾器來實現。如果在您有機會更新之前更改了時間戳,則更新操作將無法找到該文檔。
例如:
UpdateResult updateResult;
do
{
var document = await collection.Find(_ => _.Id == id).SingleAsync(); // Get the current document
updateResult = await collection.UpdateOneAsync(_ => _.Id == id && _.TimeStamp == document.TimeStamp, Builders<Item>.Update...); // Update the document only if the timestamp is the same
} while (updateResult.ModifiedCount == 0); // Try until an update was successfull
很好的例子:)不過,一般來說,你應該使用'DateTime's解決技術這樣的東西,因爲它是不可靠的遠離 - [「每秒1秒更難比它聽起來的要多「](https://rachelbythebay.com/w/2014/06/14/time/),但也有簡單的棘手的東西,如夏令時,可以激起時鐘總是增加的概念,將永遠不會再一樣。 我建議你在文檔的'Revision'字段中使用一個好的''int'',然後每次執行編輯時增加它。 – mookid8000
@ mookid8000 MongoDB中的所有日期都是以UTC表示的,但不管怎麼說都不錯。 – i3arnon
哦,是的,沒錯 - 忘記節省時間);但時鐘往返漂移實際上非常普遍,如果你的更新頻繁,你會在某些時候被這個打擊 - 在這種情況下,你會失去另一個更新者的編輯,你可能永遠不知道爲什麼會發生。微妙 - 令人恐懼! :-o – mookid8000