(обновлено 2019-7-2) Через 7 дней, наконец, я решил этот вопрос.Ну, мой код в порядке, WTF, потратил так много времени.Вопрос заключается в том, что моя команда использует AliCloud (китайская компания, такая как Amazon, Azure), и Mongodb имеет много версий. Мы создали базу данных год назад, и эта версия заблокирует базу данных во время обработки транзакции.
если у вас возникнут проблемы, надеюсь, что мой опыт может помочь.
простите мой плохой английский ...
dev среда: кластер mongodb4.0 с 3 узлами,поддержка транзакций..net core 2.2 (драйвер mongodb 2.7.2+) Robot 3T (инструмент mongod)
база данных MongoDB будет заблокирована через 60 секунд после начала транзакции, я подумал, что, возможно, проблема в уровне блокировки, но яуже перепробовал все перечисления readconcern или writeconvern, ничего не помогает.
вот изображение: теперь база данных заблокирована, я не могу запрашивать данные ни в Robot 3T, ни в моем веб-приложении.
Я имею в виду,перед commitTransaction / abortTransaction база данных будет заблокирована.если перевод большой, завершается через 30 с, на самом деле веб-приложение не может прочитать ответ данных другим посетителям.
на самом деле, пользователи моего веб-приложения всегда говорят, почему ваше приложение работает так медленно (потому что каждый перевод блокирует базу данных на 0.xx секунды)
TransactionOptions option = new TransactionOptions(readConcern: ReadConcern.Snapshot,writeConcern: WriteConcern.W1);
ClientSessionOptions so =new ClientSessionOptions();
so.DefaultTransactionOptions = option;
var session = _dataBase.Client.StartSession();
var products = _dataBase.GetCollection<Product>("products");
var TV = new Product { Description = "Television", SKU = 4001, Price = 2000 };
session.StartTransaction(option);
try
{
products.InsertOne(session, TV);
// after the sentence , database will be locked
// before commitTransaction, the webapp cannot response, like Robot 3T, // looks like the database is locked
session.CommitTransaction();