diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs index aee01caeb0..80314557e4 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs @@ -1,5 +1,4 @@ using System; -using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -8,8 +7,6 @@ using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Driver; -using MongoDB.Driver.Core.Misc; -using MongoDB.Driver.Core.Servers; using Volo.Abp.Data; using Volo.Abp.MongoDB; using Volo.Abp.MultiTenancy; @@ -187,13 +184,18 @@ namespace Volo.Abp.Uow.MongoDB session.AdvanceOperationTime(new BsonTimestamp(unitOfWork.Options.Timeout.Value)); } - if (!IsSupportedTransactions(client)) + try { + session.StartTransaction(); + } + catch (Exception e) + { + Logger.LogError("The current MongoDB database does not support transactions, All operations will be performed in non-transactions, This may cause errors."); + Logger.LogException(e); + dbContext.ToAbpMongoDbContext().InitializeDatabase(database, client, null); return dbContext; } - - session.StartTransaction(); unitOfWork.AddTransactionApi( transactionApiKey, @@ -233,14 +235,19 @@ namespace Volo.Abp.Uow.MongoDB session.AdvanceOperationTime(new BsonTimestamp(unitOfWork.Options.Timeout.Value)); } - if (!IsSupportedTransactions(client)) + try + { + session.StartTransaction(); + } + catch (Exception e) { + Logger.LogError("The current MongoDB database does not support transactions, All operations will be performed in non-transactions, This may cause errors."); + Logger.LogException(e); + dbContext.ToAbpMongoDbContext().InitializeDatabase(database, client, null); return dbContext; } - - session.StartTransaction(); - + unitOfWork.AddTransactionApi( transactionApiKey, new MongoDbTransactionApi( @@ -300,55 +307,5 @@ namespace Volo.Abp.Uow.MongoDB { return _cancellationTokenProvider.FallbackToProvider(preferredValue); } - - /// - /// https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB.Driver.Core/Core/Bindings/CoreSession.cs#L495 - /// - /// - /// - /// - protected virtual bool IsSupportedTransactions(MongoClient client) - { - try - { - var connectedDataBearingServers = client.Cluster.Description.Servers.Where(s => s.State == ServerState.Connected && s.IsDataBearing).ToList(); - - if (connectedDataBearingServers.Count == 0) - { - throw new NotSupportedException("StartTransaction cannot determine if transactions are supported because there are no connected servers."); - } - - foreach (var connectedDataBearingServer in connectedDataBearingServers) - { - var serverType = connectedDataBearingServer.Type; - - switch (serverType) - { - case ServerType.Standalone: - throw new NotSupportedException("Standalone servers do not support transactions."); - case ServerType.ShardRouter: - Feature.ShardedTransactions.ThrowIfNotSupported(connectedDataBearingServer.Version); - break; - case ServerType.LoadBalanced: - // do nothing, load balancing always supports transactions - break; - default: - Feature.Transactions.ThrowIfNotSupported(connectedDataBearingServer.Version); - break; - } - } - } - catch (Exception e) - { - Logger.LogError("The current MongoDB database does not support transactions, " + - "All operations will be performed in non-transactions. " + - "This may cause errors, " + - "Please make your database support transactions."); - Logger.LogException(e); - return false; - } - - return true; - } } }