Browse Source

Remove `IsSupportedTransactions`

pull/10658/head
maliming 5 years ago
parent
commit
d9fc461167
No known key found for this signature in database GPG Key ID: 96224957E51C89E
  1. 77
      framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs

77
framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs

@ -1,5 +1,4 @@
using System; using System;
using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -8,8 +7,6 @@ using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using MongoDB.Bson; using MongoDB.Bson;
using MongoDB.Driver; using MongoDB.Driver;
using MongoDB.Driver.Core.Misc;
using MongoDB.Driver.Core.Servers;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.MongoDB; using Volo.Abp.MongoDB;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
@ -187,13 +184,18 @@ namespace Volo.Abp.Uow.MongoDB
session.AdvanceOperationTime(new BsonTimestamp(unitOfWork.Options.Timeout.Value)); 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); dbContext.ToAbpMongoDbContext().InitializeDatabase(database, client, null);
return dbContext; return dbContext;
} }
session.StartTransaction();
unitOfWork.AddTransactionApi( unitOfWork.AddTransactionApi(
transactionApiKey, transactionApiKey,
@ -233,14 +235,19 @@ namespace Volo.Abp.Uow.MongoDB
session.AdvanceOperationTime(new BsonTimestamp(unitOfWork.Options.Timeout.Value)); 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); dbContext.ToAbpMongoDbContext().InitializeDatabase(database, client, null);
return dbContext; return dbContext;
} }
session.StartTransaction();
unitOfWork.AddTransactionApi( unitOfWork.AddTransactionApi(
transactionApiKey, transactionApiKey,
new MongoDbTransactionApi( new MongoDbTransactionApi(
@ -300,55 +307,5 @@ namespace Volo.Abp.Uow.MongoDB
{ {
return _cancellationTokenProvider.FallbackToProvider(preferredValue); return _cancellationTokenProvider.FallbackToProvider(preferredValue);
} }
/// <summary>
/// https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB.Driver.Core/Core/Bindings/CoreSession.cs#L495
/// </summary>
/// <param name="client"></param>
/// <returns></returns>
/// <exception cref="NotSupportedException"></exception>
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;
}
} }
} }

Loading…
Cancel
Save