优化代码针对commit的提交判断
This commit is contained in:
parent
5eebc2aba2
commit
9246b09b5a
|
@ -65,7 +65,6 @@ namespace Sample.MySql.Controllers
|
|||
// //一定要先在路由里面添加尾巴
|
||||
// virtualTableRoute.Append("20220921");
|
||||
// shardingTableCreator.CreateTable<SysUserMod>("ds0","20220921");
|
||||
|
||||
return _defaultTableDbContext.Set<SysTest>();
|
||||
}
|
||||
[HttpGet]
|
||||
|
|
|
@ -92,13 +92,19 @@ namespace ShardingCore.EFCores
|
|||
await _shardingDbContext.CommitAsync(cancellationToken);
|
||||
_shardingDbContext.NotifyShardingTransaction();
|
||||
}
|
||||
// #if !NETCOREAPP3_0
|
||||
#if !NETCOREAPP3_0&&!NETSTANDARD2_0
|
||||
// public override void CreateSavepoint(string name)
|
||||
// {
|
||||
// AAA
|
||||
// base.CreateSavepoint(name);
|
||||
// _shardingDbContext.CreateSavepoint(name);
|
||||
// }
|
||||
// #endif
|
||||
//
|
||||
// public override async Task CreateSavepointAsync(string name, CancellationToken cancellationToken = new CancellationToken())
|
||||
// {
|
||||
// await base.CreateSavepointAsync(name, cancellationToken);
|
||||
// await _shardingDbContext.CreateSavepointAsync(name,cancellationToken);
|
||||
// }
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
}
|
|
@ -91,6 +91,15 @@ namespace ShardingCore.Sharding.Abstractions
|
|||
/// <param name="cancellationToken"></param>
|
||||
/// <returns></returns>
|
||||
Task CommitAsync(CancellationToken cancellationToken = new CancellationToken());
|
||||
|
||||
#if !NETCOREAPP3_0&&!NETSTANDARD2_0
|
||||
// void CreateSavepoint(string name);
|
||||
// Task CreateSavepointAsync(string name, CancellationToken cancellationToken = new CancellationToken());
|
||||
// void RollbackToSavepoint(string name);
|
||||
// Task RollbackToSavepointAsync(string name,CancellationToken cancellationToken = default(CancellationToken));
|
||||
// void ReleaseSavepoint(string name);
|
||||
// Task ReleaseSavepointAsync(string name, CancellationToken cancellationToken = default(CancellationToken));
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,6 +21,14 @@ namespace ShardingCore.Sharding.Abstractions
|
|||
#if !NETCOREAPP2_0
|
||||
Task RollbackAsync(CancellationToken cancellationToken = new CancellationToken());
|
||||
Task CommitAsync(CancellationToken cancellationToken = new CancellationToken());
|
||||
#if !NETCOREAPP3_0 && !NETSTANDARD2_0
|
||||
// void CreateSavepoint(string name);
|
||||
// Task CreateSavepointAsync(string name, CancellationToken cancellationToken = new CancellationToken());
|
||||
// void RollbackToSavepoint(string name);
|
||||
// Task RollbackToSavepointAsync(string name,CancellationToken cancellationToken = default(CancellationToken));
|
||||
// void ReleaseSavepoint(string name);
|
||||
// Task ReleaseSavepointAsync(string name, CancellationToken cancellationToken = default(CancellationToken));
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
}
|
|
@ -18,7 +18,6 @@ using ShardingCore.Core.RuntimeContexts;
|
|||
using ShardingCore.Exceptions;
|
||||
using ShardingCore.Extensions;
|
||||
using ShardingCore.Infrastructures;
|
||||
|
||||
using ShardingCore.Sharding.Abstractions;
|
||||
|
||||
namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
||||
|
@ -32,11 +31,10 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
|||
*/
|
||||
public class DataSourceDbContext : IDataSourceDbContext
|
||||
{
|
||||
|
||||
private static readonly IComparer<string> _comparer = new NoShardingFirstComparer();
|
||||
|
||||
private readonly ILogger<DataSourceDbContext> _logger;
|
||||
public Type DbContextType { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前是否是默认的dbcontext 也就是不分片的dbcontext
|
||||
/// </summary>
|
||||
|
@ -82,6 +80,7 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
|||
/// shell dbcontext最外面的壳
|
||||
/// </summary>
|
||||
private readonly DbContext _shardingShellDbContext;
|
||||
|
||||
private readonly IShardingRuntimeContext _shardingRuntimeContext;
|
||||
|
||||
/// <summary>
|
||||
|
@ -117,8 +116,7 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
|||
bool isDefault,
|
||||
DbContext shardingShellDbContext,
|
||||
IDbContextCreator dbContextCreator,
|
||||
ActualConnectionStringManager actualConnectionStringManager,
|
||||
ILogger<DataSourceDbContext> logger)
|
||||
ActualConnectionStringManager actualConnectionStringManager)
|
||||
{
|
||||
var shardingDbContext = (IShardingDbContext)shardingShellDbContext;
|
||||
DataSourceName = dataSourceName;
|
||||
|
@ -130,7 +128,6 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
|||
.GetVirtualDataSource();
|
||||
_dbContextCreator = dbContextCreator;
|
||||
_actualConnectionStringManager = actualConnectionStringManager;
|
||||
this._logger = logger;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -155,7 +152,8 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
|||
{
|
||||
//先创建dbcontext option builder
|
||||
var dbContextOptionBuilderCreator = _shardingRuntimeContext.GetDbContextOptionBuilderCreator();
|
||||
var dbContextOptionsBuilder = dbContextOptionBuilderCreator.CreateDbContextOptionBuilder().UseShardingOptions(_shardingRuntimeContext);
|
||||
var dbContextOptionsBuilder = dbContextOptionBuilderCreator.CreateDbContextOptionBuilder()
|
||||
.UseShardingOptions(_shardingRuntimeContext);
|
||||
|
||||
if (IsDefault)
|
||||
{
|
||||
|
@ -342,70 +340,88 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
|||
{
|
||||
if (IsDefault)
|
||||
return;
|
||||
try
|
||||
{
|
||||
CurrentDbContextTransaction?.Rollback();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError(e, "rollback error.");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 提交数据
|
||||
/// </summary>
|
||||
/// <param name="dataSourceCount">如果只有一个数据源那么就直接报错否则就忽略</param>
|
||||
public void Commit(int dataSourceCount)
|
||||
public void Commit()
|
||||
{
|
||||
if (IsDefault)
|
||||
return;
|
||||
try
|
||||
{
|
||||
CurrentDbContextTransaction?.Commit();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError(e, "commit error.");
|
||||
if (dataSourceCount == 1)
|
||||
throw;
|
||||
}
|
||||
}
|
||||
#if !NETCOREAPP2_0
|
||||
public async Task RollbackAsync(CancellationToken cancellationToken = new CancellationToken())
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
if (IsDefault)
|
||||
return;
|
||||
try
|
||||
{
|
||||
if (CurrentDbContextTransaction != null)
|
||||
await CurrentDbContextTransaction.RollbackAsync(cancellationToken);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError(e, "rollback error.");
|
||||
}
|
||||
}
|
||||
|
||||
public async Task CommitAsync(int dataSourceCount, CancellationToken cancellationToken =
|
||||
public async Task CommitAsync(CancellationToken cancellationToken =
|
||||
new CancellationToken())
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
if (IsDefault)
|
||||
return;
|
||||
try
|
||||
{
|
||||
if (CurrentDbContextTransaction != null)
|
||||
await CurrentDbContextTransaction.CommitAsync(cancellationToken);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError(e, "commit error.");
|
||||
if (dataSourceCount == 1)
|
||||
throw;
|
||||
}
|
||||
}
|
||||
#if !NETCOREAPP3_0&&!NETSTANDARD2_0
|
||||
// public void CreateSavepoint(string name)
|
||||
// {
|
||||
// if (IsDefault)
|
||||
// return;
|
||||
// CurrentDbContextTransaction?.CreateSavepoint(name);
|
||||
// }
|
||||
//
|
||||
// public async Task CreateSavepointAsync(string name,
|
||||
// CancellationToken cancellationToken = new CancellationToken())
|
||||
// {
|
||||
// cancellationToken.ThrowIfCancellationRequested();
|
||||
// if (IsDefault)
|
||||
// return;
|
||||
// if (CurrentDbContextTransaction != null)
|
||||
// await CurrentDbContextTransaction.CreateSavepointAsync(name, cancellationToken);
|
||||
// }
|
||||
//
|
||||
// public void RollbackToSavepoint(string name)
|
||||
// {
|
||||
// if (IsDefault)
|
||||
// return;
|
||||
// CurrentDbContextTransaction?.RollbackToSavepoint(name);
|
||||
// }
|
||||
//
|
||||
// public async Task RollbackToSavepointAsync(string name,
|
||||
// CancellationToken cancellationToken = default(CancellationToken))
|
||||
// {
|
||||
// cancellationToken.ThrowIfCancellationRequested();
|
||||
// if (IsDefault)
|
||||
// return;
|
||||
// if (CurrentDbContextTransaction != null)
|
||||
// await CurrentDbContextTransaction.RollbackToSavepointAsync(name, cancellationToken);
|
||||
// }
|
||||
//
|
||||
// public void ReleaseSavepoint(string name)
|
||||
// {
|
||||
// if (IsDefault)
|
||||
// return;
|
||||
// CurrentDbContextTransaction?.ReleaseSavepoint(name);
|
||||
// }
|
||||
//
|
||||
// public async Task ReleaseSavepointAsync(string name, CancellationToken cancellationToken = default(CancellationToken))
|
||||
// {
|
||||
// cancellationToken.ThrowIfCancellationRequested();
|
||||
// if (IsDefault)
|
||||
// return;
|
||||
// if (CurrentDbContextTransaction != null)
|
||||
// await CurrentDbContextTransaction.ReleaseSavepointAsync(name, cancellationToken);
|
||||
// }
|
||||
#endif
|
||||
#endif
|
||||
|
||||
public void Dispose()
|
||||
|
|
|
@ -45,10 +45,18 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
|||
IDictionary<string, DbContext> GetCurrentContexts();
|
||||
|
||||
void Rollback();
|
||||
void Commit(int dataSourceCount);
|
||||
void Commit();
|
||||
#if !NETCOREAPP2_0
|
||||
Task RollbackAsync(CancellationToken cancellationToken = new CancellationToken());
|
||||
Task CommitAsync(int dataSourceCount,CancellationToken cancellationToken = new CancellationToken());
|
||||
Task CommitAsync(CancellationToken cancellationToken = new CancellationToken());
|
||||
#if !NETCOREAPP3_0&&!NETSTANDARD2_0
|
||||
// void CreateSavepoint(string name);
|
||||
// Task CreateSavepointAsync(string name, CancellationToken cancellationToken = new CancellationToken());
|
||||
// void RollbackToSavepoint(string name);
|
||||
// Task RollbackToSavepointAsync(string name,CancellationToken cancellationToken = default(CancellationToken));
|
||||
// void ReleaseSavepoint(string name);
|
||||
// Task ReleaseSavepointAsync(string name, CancellationToken cancellationToken = default(CancellationToken));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
|||
/// <typeparam name="TShardingDbContext"></typeparam>
|
||||
public class ShardingDbContextExecutor : IShardingDbContextExecutor
|
||||
{
|
||||
private readonly ILoggerFactory _loggerFactory;
|
||||
private readonly ILogger<ShardingDbContextExecutor> _logger;
|
||||
private readonly DbContext _shardingDbContext;
|
||||
|
||||
//private readonly ConcurrentDictionary<string, ConcurrentDictionary<string, DbContext>> _dbContextCaches = new ConcurrentDictionary<string, ConcurrentDictionary<string, DbContext>>();
|
||||
|
@ -78,7 +78,8 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
|||
_routeTailFactory = _shardingRuntimeContext.GetRouteTailFactory();
|
||||
var shardingReadWriteManager = _shardingRuntimeContext.GetShardingReadWriteManager();
|
||||
var shardingProvider = _shardingRuntimeContext.GetShardingProvider();
|
||||
_loggerFactory=shardingProvider.GetService<ILoggerFactory>();
|
||||
var loggerFactory=shardingProvider.GetRequiredService<ILoggerFactory>();
|
||||
_logger=loggerFactory.CreateLogger<ShardingDbContextExecutor>();
|
||||
_actualConnectionStringManager = new ActualConnectionStringManager(shardingReadWriteManager,_virtualDataSource);
|
||||
}
|
||||
|
||||
|
@ -86,7 +87,7 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
|||
|
||||
private IDataSourceDbContext GetDataSourceDbContext(string dataSourceName)
|
||||
{
|
||||
return _dbContextCaches.GetOrAdd(dataSourceName, dsname => new DataSourceDbContext(dsname, _virtualDataSource.IsDefault(dsname), _shardingDbContext, _dbContextCreator, _actualConnectionStringManager,_loggerFactory.CreateLogger<DataSourceDbContext>()));
|
||||
return _dbContextCaches.GetOrAdd(dataSourceName, dsname => new DataSourceDbContext(dsname, _virtualDataSource.IsDefault(dsname), _shardingDbContext, _dbContextCreator, _actualConnectionStringManager));
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
|
@ -194,9 +195,20 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
|||
|
||||
public void Commit()
|
||||
{
|
||||
int i = 0;
|
||||
foreach (var dbContextCache in _dbContextCaches)
|
||||
{
|
||||
dbContextCache.Value.Commit(_dbContextCaches.Count);
|
||||
try
|
||||
{
|
||||
dbContextCache.Value.Commit();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError(e, "commit error.");
|
||||
if (i == 0)
|
||||
throw;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
AutoUseWriteConnectionString();
|
||||
|
@ -231,9 +243,20 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
|||
|
||||
public async Task CommitAsync(CancellationToken cancellationToken = new CancellationToken())
|
||||
{
|
||||
int i = 0;
|
||||
foreach (var dbContextCache in _dbContextCaches)
|
||||
{
|
||||
await dbContextCache.Value.CommitAsync(_dbContextCaches.Count, cancellationToken);
|
||||
try
|
||||
{
|
||||
await dbContextCache.Value.CommitAsync(cancellationToken);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError(e, "commit error.");
|
||||
if (i == 0)
|
||||
throw;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
AutoUseWriteConnectionString();
|
||||
|
|
Loading…
Reference in New Issue