Mongodb обрабатывает только одну запись за раз? - PullRequest
1 голос
/ 07 мая 2020

Я использую Mongodb в ядре net. В то же время у меня есть много приложений, которые запрашивают одну и ту же таблицу. У меня проблема, что во многих приложениях обрабатывается 1 запись. Я использовал версию в пн go, но она не сработала. Вот мой код:

        try
        {
            TopupRequest topupReturn = null;
            do
            {
                var topupRequest = await _paygateMongoRepository.GetOneAsync<TopupRequest>(p =>
                    p.Status == TopupStatus.Init && categoryCodes.Contains(p.CategoryCode) &&
                    p.ServiceCode == serviceCode);

                if (topupRequest == null)
                    break;

                var version = topupRequest.Version;
                var versionPlus = topupRequest.Version + 1;

                Expression<Func<TopupRequest, bool>> filter = p => p.Id == topupRequest.Id && p.Version == version;
                var options = new FindOneAndUpdateOptions<TopupRequest, TopupRequest>
                {
                    IsUpsert = false,
                    ReturnDocument = ReturnDocument.After
                };

                _logger.Info("Version: " + version + " version plus: " + versionPlus);

                topupReturn = await _paygateMongoRepository.GetAndUpdateOne<TopupRequest, Guid>(filter,
                    Builders<TopupRequest>.Update.Set(m => m.Status, TopupStatus.InProcessing)
                        .Set(m => m.Version, versionPlus)
                        .Set(m => m.WorkerApp, workerApp), options);

                _logger.Info("Version: " + version + " version plus: " + versionPlus);
            } while (topupReturn == null);


            if (topupReturn == null) return null;
            if (timeout > 0 && topupReturn.CreatedTime.AddSeconds(timeout) <= DateTime.UtcNow) return null;
            _logger.Info($"GetTopupPriorityAvailableVersionAsync success: {topupReturn.ToJson()}");
            return topupReturn.ConvertTo<TopupRequestDto>();
        }
        catch (Exception e)
        {
            _logger.Info($"GetTopupPriorityAvailableVersionAsync error: {e}");
            return null;
        }

Я использовал решение для транзакций. Но и у меня это не работает.

using (var session = MongoDbContext.Client.StartSession())
        {
            var topups = MongoDbContext.GetCollection<TopupRequest>();
            try
            {
                session.StartTransaction(new TransactionOptions(
                    readConcern: ReadConcern.Local,
                    readPreference: ReadPreference.Primary,
                    writeConcern: WriteConcern.WMajority));

                var sort = Builders<TopupRequest>.Sort.Descending("CreatedTime");

                var filter = Builders<TopupRequest>.Filter.Eq(p => p.Status, TopupStatus.Init)
                             & Builders<TopupRequest>.Filter.In("CategoryCode", categoryCodes)
                             & Builders<TopupRequest>.Filter.Eq(p => p.ServiceCode, serviceCode);

                var options = new FindOneAndUpdateOptions<TopupRequest, TopupRequest>
                {
                    IsUpsert = false, 
                    ReturnDocument = ReturnDocument.After,
                    Sort = sort
                };
                var update = Builders<TopupRequest>.Update.Set("Status", TopupStatus.InProcessing);

                var result = await topups.FindOneAndUpdateAsync(session, filter, update,options);
                if (result == null)
                    session.AbortTransaction();

                session.CommitTransaction();
                return result;
            }
            catch (Exception e)
            {
                session.AbortTransaction();
                Console.WriteLine(e);
                return null;
            }
        }

У меня все еще была та же проблема в то же время, когда 1 запись использовалась много раз. Пожалуйста, помогите мне

...