diff --git a/samples/Sample.MySql/Controllers/WeatherForecastController.cs b/samples/Sample.MySql/Controllers/WeatherForecastController.cs index 7ba7acc0..942e79b8 100644 --- a/samples/Sample.MySql/Controllers/WeatherForecastController.cs +++ b/samples/Sample.MySql/Controllers/WeatherForecastController.cs @@ -65,7 +65,6 @@ namespace Sample.MySql.Controllers // //一定要先在路由里面添加尾巴 // virtualTableRoute.Append("20220921"); // shardingTableCreator.CreateTable("ds0","20220921"); - return _defaultTableDbContext.Set(); } [HttpGet] diff --git a/src/ShardingCore/EFCores/RelationTransactions/ShardingRelationalTransaction.cs b/src/ShardingCore/EFCores/RelationTransactions/ShardingRelationalTransaction.cs index ca3a7f0d..bab0be75 100644 --- a/src/ShardingCore/EFCores/RelationTransactions/ShardingRelationalTransaction.cs +++ b/src/ShardingCore/EFCores/RelationTransactions/ShardingRelationalTransaction.cs @@ -92,13 +92,19 @@ namespace ShardingCore.EFCores await _shardingDbContext.CommitAsync(cancellationToken); _shardingDbContext.NotifyShardingTransaction(); } -// #if !NETCOREAPP3_0 -// public override void CreateSavepoint(string name) -// { -// AAA -// base.CreateSavepoint(name); -// } -// #endif +#if !NETCOREAPP3_0&&!NETSTANDARD2_0 + // public override void CreateSavepoint(string name) + // { + // base.CreateSavepoint(name); + // _shardingDbContext.CreateSavepoint(name); + // } + // + // public override async Task CreateSavepointAsync(string name, CancellationToken cancellationToken = new CancellationToken()) + // { + // await base.CreateSavepointAsync(name, cancellationToken); + // await _shardingDbContext.CreateSavepointAsync(name,cancellationToken); + // } +#endif #endif } } \ No newline at end of file diff --git a/src/ShardingCore/Sharding/Abstractions/IShardingDbContextExecutor.cs b/src/ShardingCore/Sharding/Abstractions/IShardingDbContextExecutor.cs index c4490175..e48c64cc 100644 --- a/src/ShardingCore/Sharding/Abstractions/IShardingDbContextExecutor.cs +++ b/src/ShardingCore/Sharding/Abstractions/IShardingDbContextExecutor.cs @@ -91,6 +91,15 @@ namespace ShardingCore.Sharding.Abstractions /// /// 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 } } diff --git a/src/ShardingCore/Sharding/Abstractions/IShardingTransaction.cs b/src/ShardingCore/Sharding/Abstractions/IShardingTransaction.cs index eb6f18ae..5a7beedc 100644 --- a/src/ShardingCore/Sharding/Abstractions/IShardingTransaction.cs +++ b/src/ShardingCore/Sharding/Abstractions/IShardingTransaction.cs @@ -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 } -} +} \ No newline at end of file diff --git a/src/ShardingCore/Sharding/ShardingDbContextExecutors/DataSourceDbContext.cs b/src/ShardingCore/Sharding/ShardingDbContextExecutors/DataSourceDbContext.cs index fbc1e945..a460063c 100644 --- a/src/ShardingCore/Sharding/ShardingDbContextExecutors/DataSourceDbContext.cs +++ b/src/ShardingCore/Sharding/ShardingDbContextExecutors/DataSourceDbContext.cs @@ -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 _comparer = new NoShardingFirstComparer(); - private readonly ILogger _logger; public Type DbContextType { get; } + /// /// 当前是否是默认的dbcontext 也就是不分片的dbcontext /// @@ -82,6 +80,7 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors /// shell dbcontext最外面的壳 /// private readonly DbContext _shardingShellDbContext; + private readonly IShardingRuntimeContext _shardingRuntimeContext; /// @@ -117,8 +116,7 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors bool isDefault, DbContext shardingShellDbContext, IDbContextCreator dbContextCreator, - ActualConnectionStringManager actualConnectionStringManager, - ILogger logger) + ActualConnectionStringManager actualConnectionStringManager) { var shardingDbContext = (IShardingDbContext)shardingShellDbContext; DataSourceName = dataSourceName; @@ -126,11 +124,10 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors _shardingShellDbContext = shardingShellDbContext; _shardingRuntimeContext = shardingShellDbContext.GetShardingRuntimeContext(); DbContextType = shardingShellDbContext.GetType(); - _virtualDataSource =shardingDbContext + _virtualDataSource = shardingDbContext .GetVirtualDataSource(); _dbContextCreator = dbContextCreator; _actualConnectionStringManager = actualConnectionStringManager; - this._logger = logger; } /// @@ -155,8 +152,9 @@ 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) { //如果是默认的需要使用shell的dbconnection为了保证可以使用事务 @@ -342,34 +340,17 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors { if (IsDefault) return; - try - { - CurrentDbContextTransaction?.Rollback(); - } - catch (Exception e) - { - _logger.LogError(e, "rollback error."); - } + CurrentDbContextTransaction?.Rollback(); } /// /// 提交数据 /// - /// 如果只有一个数据源那么就直接报错否则就忽略 - 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; - } + CurrentDbContextTransaction?.Commit(); } #if !NETCOREAPP2_0 public async Task RollbackAsync(CancellationToken cancellationToken = new CancellationToken()) @@ -377,35 +358,70 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors cancellationToken.ThrowIfCancellationRequested(); if (IsDefault) return; - try - { - if (CurrentDbContextTransaction != null) - await CurrentDbContextTransaction.RollbackAsync(cancellationToken); - } - catch (Exception e) - { - _logger.LogError(e, "rollback error."); - } + if (CurrentDbContextTransaction != null) + await CurrentDbContextTransaction.RollbackAsync(cancellationToken); } - public async Task CommitAsync(int dataSourceCount, CancellationToken cancellationToken = - new 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 (CurrentDbContextTransaction != null) + await CurrentDbContextTransaction.CommitAsync(cancellationToken); } +#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() diff --git a/src/ShardingCore/Sharding/ShardingDbContextExecutors/IDataSourceDbContext.cs b/src/ShardingCore/Sharding/ShardingDbContextExecutors/IDataSourceDbContext.cs index 370a946b..139966bd 100644 --- a/src/ShardingCore/Sharding/ShardingDbContextExecutors/IDataSourceDbContext.cs +++ b/src/ShardingCore/Sharding/ShardingDbContextExecutors/IDataSourceDbContext.cs @@ -45,10 +45,18 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors IDictionary 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 } diff --git a/src/ShardingCore/Sharding/ShardingDbContextExecutors/ShardingDbContextExecutor.cs b/src/ShardingCore/Sharding/ShardingDbContextExecutors/ShardingDbContextExecutor.cs index 27784205..3fb66d84 100644 --- a/src/ShardingCore/Sharding/ShardingDbContextExecutors/ShardingDbContextExecutor.cs +++ b/src/ShardingCore/Sharding/ShardingDbContextExecutors/ShardingDbContextExecutor.cs @@ -34,7 +34,7 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors /// public class ShardingDbContextExecutor : IShardingDbContextExecutor { - private readonly ILoggerFactory _loggerFactory; + private readonly ILogger _logger; private readonly DbContext _shardingDbContext; //private readonly ConcurrentDictionary> _dbContextCaches = new ConcurrentDictionary>(); @@ -78,7 +78,8 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors _routeTailFactory = _shardingRuntimeContext.GetRouteTailFactory(); var shardingReadWriteManager = _shardingRuntimeContext.GetShardingReadWriteManager(); var shardingProvider = _shardingRuntimeContext.GetShardingProvider(); - _loggerFactory=shardingProvider.GetService(); + var loggerFactory=shardingProvider.GetRequiredService(); + _logger=loggerFactory.CreateLogger(); _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())); + return _dbContextCaches.GetOrAdd(dataSourceName, dsname => new DataSourceDbContext(dsname, _virtualDataSource.IsDefault(dsname), _shardingDbContext, _dbContextCreator, _actualConnectionStringManager)); } /// @@ -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();