Skip to content

Commit 9246b09

Browse files
committed
优化代码针对commit的提交判断
1 parent 5eebc2a commit 9246b09

File tree

7 files changed

+136
-67
lines changed

7 files changed

+136
-67
lines changed

samples/Sample.MySql/Controllers/WeatherForecastController.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ public IQueryable<SysTest> GetAll()
6565
// //一定要先在路由里面添加尾巴
6666
// virtualTableRoute.Append("20220921");
6767
// shardingTableCreator.CreateTable<SysUserMod>("ds0","20220921");
68-
6968
return _defaultTableDbContext.Set<SysTest>();
7069
}
7170
[HttpGet]

src/ShardingCore/EFCores/RelationTransactions/ShardingRelationalTransaction.cs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,19 @@ public override void Rollback()
9292
await _shardingDbContext.CommitAsync(cancellationToken);
9393
_shardingDbContext.NotifyShardingTransaction();
9494
}
95-
// #if !NETCOREAPP3_0
96-
// public override void CreateSavepoint(string name)
97-
// {
98-
// AAA
99-
// base.CreateSavepoint(name);
100-
// }
101-
// #endif
95+
#if !NETCOREAPP3_0&&!NETSTANDARD2_0
96+
// public override void CreateSavepoint(string name)
97+
// {
98+
// base.CreateSavepoint(name);
99+
// _shardingDbContext.CreateSavepoint(name);
100+
// }
101+
//
102+
// public override async Task CreateSavepointAsync(string name, CancellationToken cancellationToken = new CancellationToken())
103+
// {
104+
// await base.CreateSavepointAsync(name, cancellationToken);
105+
// await _shardingDbContext.CreateSavepointAsync(name,cancellationToken);
106+
// }
107+
#endif
102108
#endif
103109
}
104110
}

src/ShardingCore/Sharding/Abstractions/IShardingDbContextExecutor.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,15 @@ Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess,
9191
/// <param name="cancellationToken"></param>
9292
/// <returns></returns>
9393
Task CommitAsync(CancellationToken cancellationToken = new CancellationToken());
94+
95+
#if !NETCOREAPP3_0&&!NETSTANDARD2_0
96+
// void CreateSavepoint(string name);
97+
// Task CreateSavepointAsync(string name, CancellationToken cancellationToken = new CancellationToken());
98+
// void RollbackToSavepoint(string name);
99+
// Task RollbackToSavepointAsync(string name,CancellationToken cancellationToken = default(CancellationToken));
100+
// void ReleaseSavepoint(string name);
101+
// Task ReleaseSavepointAsync(string name, CancellationToken cancellationToken = default(CancellationToken));
102+
#endif
94103
#endif
95104
}
96105
}

src/ShardingCore/Sharding/Abstractions/IShardingTransaction.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@ public interface IShardingTransaction
2121
#if !NETCOREAPP2_0
2222
Task RollbackAsync(CancellationToken cancellationToken = new CancellationToken());
2323
Task CommitAsync(CancellationToken cancellationToken = new CancellationToken());
24+
#if !NETCOREAPP3_0 && !NETSTANDARD2_0
25+
// void CreateSavepoint(string name);
26+
// Task CreateSavepointAsync(string name, CancellationToken cancellationToken = new CancellationToken());
27+
// void RollbackToSavepoint(string name);
28+
// Task RollbackToSavepointAsync(string name,CancellationToken cancellationToken = default(CancellationToken));
29+
// void ReleaseSavepoint(string name);
30+
// Task ReleaseSavepointAsync(string name, CancellationToken cancellationToken = default(CancellationToken));
31+
#endif
2432
#endif
2533
}
26-
}
34+
}

src/ShardingCore/Sharding/ShardingDbContextExecutors/DataSourceDbContext.cs

Lines changed: 67 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
using ShardingCore.Exceptions;
1919
using ShardingCore.Extensions;
2020
using ShardingCore.Infrastructures;
21-
2221
using ShardingCore.Sharding.Abstractions;
2322

2423
namespace ShardingCore.Sharding.ShardingDbContextExecutors
@@ -32,11 +31,10 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
3231
*/
3332
public class DataSourceDbContext : IDataSourceDbContext
3433
{
35-
3634
private static readonly IComparer<string> _comparer = new NoShardingFirstComparer();
3735

38-
private readonly ILogger<DataSourceDbContext> _logger;
3936
public Type DbContextType { get; }
37+
4038
/// <summary>
4139
/// 当前是否是默认的dbcontext 也就是不分片的dbcontext
4240
/// </summary>
@@ -82,6 +80,7 @@ public class DataSourceDbContext : IDataSourceDbContext
8280
/// shell dbcontext最外面的壳
8381
/// </summary>
8482
private readonly DbContext _shardingShellDbContext;
83+
8584
private readonly IShardingRuntimeContext _shardingRuntimeContext;
8685

8786
/// <summary>
@@ -117,20 +116,18 @@ public DataSourceDbContext(string dataSourceName,
117116
bool isDefault,
118117
DbContext shardingShellDbContext,
119118
IDbContextCreator dbContextCreator,
120-
ActualConnectionStringManager actualConnectionStringManager,
121-
ILogger<DataSourceDbContext> logger)
119+
ActualConnectionStringManager actualConnectionStringManager)
122120
{
123121
var shardingDbContext = (IShardingDbContext)shardingShellDbContext;
124122
DataSourceName = dataSourceName;
125123
IsDefault = isDefault;
126124
_shardingShellDbContext = shardingShellDbContext;
127125
_shardingRuntimeContext = shardingShellDbContext.GetShardingRuntimeContext();
128126
DbContextType = shardingShellDbContext.GetType();
129-
_virtualDataSource =shardingDbContext
127+
_virtualDataSource = shardingDbContext
130128
.GetVirtualDataSource();
131129
_dbContextCreator = dbContextCreator;
132130
_actualConnectionStringManager = actualConnectionStringManager;
133-
this._logger = logger;
134131
}
135132

136133
/// <summary>
@@ -155,8 +152,9 @@ private DbContextOptions CreateShareDbContextOptionsBuilder()
155152
{
156153
//先创建dbcontext option builder
157154
var dbContextOptionBuilderCreator = _shardingRuntimeContext.GetDbContextOptionBuilderCreator();
158-
var dbContextOptionsBuilder = dbContextOptionBuilderCreator.CreateDbContextOptionBuilder().UseShardingOptions(_shardingRuntimeContext);
159-
155+
var dbContextOptionsBuilder = dbContextOptionBuilderCreator.CreateDbContextOptionBuilder()
156+
.UseShardingOptions(_shardingRuntimeContext);
157+
160158
if (IsDefault)
161159
{
162160
//如果是默认的需要使用shell的dbconnection为了保证可以使用事务
@@ -342,70 +340,88 @@ public void Rollback()
342340
{
343341
if (IsDefault)
344342
return;
345-
try
346-
{
347-
CurrentDbContextTransaction?.Rollback();
348-
}
349-
catch (Exception e)
350-
{
351-
_logger.LogError(e, "rollback error.");
352-
}
343+
CurrentDbContextTransaction?.Rollback();
353344
}
354345

355346
/// <summary>
356347
/// 提交数据
357348
/// </summary>
358-
/// <param name="dataSourceCount">如果只有一个数据源那么就直接报错否则就忽略</param>
359-
public void Commit(int dataSourceCount)
349+
public void Commit()
360350
{
361351
if (IsDefault)
362352
return;
363-
try
364-
{
365-
CurrentDbContextTransaction?.Commit();
366-
}
367-
catch (Exception e)
368-
{
369-
_logger.LogError(e, "commit error.");
370-
if (dataSourceCount == 1)
371-
throw;
372-
}
353+
CurrentDbContextTransaction?.Commit();
373354
}
374355
#if !NETCOREAPP2_0
375356
public async Task RollbackAsync(CancellationToken cancellationToken = new CancellationToken())
376357
{
377358
cancellationToken.ThrowIfCancellationRequested();
378359
if (IsDefault)
379360
return;
380-
try
381-
{
382-
if (CurrentDbContextTransaction != null)
383-
await CurrentDbContextTransaction.RollbackAsync(cancellationToken);
384-
}
385-
catch (Exception e)
386-
{
387-
_logger.LogError(e, "rollback error.");
388-
}
361+
if (CurrentDbContextTransaction != null)
362+
await CurrentDbContextTransaction.RollbackAsync(cancellationToken);
389363
}
390364

391-
public async Task CommitAsync(int dataSourceCount, CancellationToken cancellationToken =
392-
new CancellationToken())
365+
public async Task CommitAsync(CancellationToken cancellationToken =
366+
new CancellationToken())
393367
{
394368
cancellationToken.ThrowIfCancellationRequested();
395369
if (IsDefault)
396370
return;
397-
try
398-
{
399-
if (CurrentDbContextTransaction != null)
400-
await CurrentDbContextTransaction.CommitAsync(cancellationToken);
401-
}
402-
catch (Exception e)
403-
{
404-
_logger.LogError(e, "commit error.");
405-
if (dataSourceCount == 1)
406-
throw;
407-
}
371+
if (CurrentDbContextTransaction != null)
372+
await CurrentDbContextTransaction.CommitAsync(cancellationToken);
408373
}
374+
#if !NETCOREAPP3_0&&!NETSTANDARD2_0
375+
// public void CreateSavepoint(string name)
376+
// {
377+
// if (IsDefault)
378+
// return;
379+
// CurrentDbContextTransaction?.CreateSavepoint(name);
380+
// }
381+
//
382+
// public async Task CreateSavepointAsync(string name,
383+
// CancellationToken cancellationToken = new CancellationToken())
384+
// {
385+
// cancellationToken.ThrowIfCancellationRequested();
386+
// if (IsDefault)
387+
// return;
388+
// if (CurrentDbContextTransaction != null)
389+
// await CurrentDbContextTransaction.CreateSavepointAsync(name, cancellationToken);
390+
// }
391+
//
392+
// public void RollbackToSavepoint(string name)
393+
// {
394+
// if (IsDefault)
395+
// return;
396+
// CurrentDbContextTransaction?.RollbackToSavepoint(name);
397+
// }
398+
//
399+
// public async Task RollbackToSavepointAsync(string name,
400+
// CancellationToken cancellationToken = default(CancellationToken))
401+
// {
402+
// cancellationToken.ThrowIfCancellationRequested();
403+
// if (IsDefault)
404+
// return;
405+
// if (CurrentDbContextTransaction != null)
406+
// await CurrentDbContextTransaction.RollbackToSavepointAsync(name, cancellationToken);
407+
// }
408+
//
409+
// public void ReleaseSavepoint(string name)
410+
// {
411+
// if (IsDefault)
412+
// return;
413+
// CurrentDbContextTransaction?.ReleaseSavepoint(name);
414+
// }
415+
//
416+
// public async Task ReleaseSavepointAsync(string name, CancellationToken cancellationToken = default(CancellationToken))
417+
// {
418+
// cancellationToken.ThrowIfCancellationRequested();
419+
// if (IsDefault)
420+
// return;
421+
// if (CurrentDbContextTransaction != null)
422+
// await CurrentDbContextTransaction.ReleaseSavepointAsync(name, cancellationToken);
423+
// }
424+
#endif
409425
#endif
410426

411427
public void Dispose()

src/ShardingCore/Sharding/ShardingDbContextExecutors/IDataSourceDbContext.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,18 @@ public interface IDataSourceDbContext : IDisposable
4545
IDictionary<string, DbContext> GetCurrentContexts();
4646

4747
void Rollback();
48-
void Commit(int dataSourceCount);
48+
void Commit();
4949
#if !NETCOREAPP2_0
5050
Task RollbackAsync(CancellationToken cancellationToken = new CancellationToken());
51-
Task CommitAsync(int dataSourceCount,CancellationToken cancellationToken = new CancellationToken());
51+
Task CommitAsync(CancellationToken cancellationToken = new CancellationToken());
52+
#if !NETCOREAPP3_0&&!NETSTANDARD2_0
53+
// void CreateSavepoint(string name);
54+
// Task CreateSavepointAsync(string name, CancellationToken cancellationToken = new CancellationToken());
55+
// void RollbackToSavepoint(string name);
56+
// Task RollbackToSavepointAsync(string name,CancellationToken cancellationToken = default(CancellationToken));
57+
// void ReleaseSavepoint(string name);
58+
// Task ReleaseSavepointAsync(string name, CancellationToken cancellationToken = default(CancellationToken));
59+
#endif
5260
#endif
5361

5462
}

src/ShardingCore/Sharding/ShardingDbContextExecutors/ShardingDbContextExecutor.cs

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors
3434
/// <typeparam name="TShardingDbContext"></typeparam>
3535
public class ShardingDbContextExecutor : IShardingDbContextExecutor
3636
{
37-
private readonly ILoggerFactory _loggerFactory;
37+
private readonly ILogger<ShardingDbContextExecutor> _logger;
3838
private readonly DbContext _shardingDbContext;
3939

4040
//private readonly ConcurrentDictionary<string, ConcurrentDictionary<string, DbContext>> _dbContextCaches = new ConcurrentDictionary<string, ConcurrentDictionary<string, DbContext>>();
@@ -78,15 +78,16 @@ public ShardingDbContextExecutor(DbContext shardingDbContext)
7878
_routeTailFactory = _shardingRuntimeContext.GetRouteTailFactory();
7979
var shardingReadWriteManager = _shardingRuntimeContext.GetShardingReadWriteManager();
8080
var shardingProvider = _shardingRuntimeContext.GetShardingProvider();
81-
_loggerFactory=shardingProvider.GetService<ILoggerFactory>();
81+
var loggerFactory=shardingProvider.GetRequiredService<ILoggerFactory>();
82+
_logger=loggerFactory.CreateLogger<ShardingDbContextExecutor>();
8283
_actualConnectionStringManager = new ActualConnectionStringManager(shardingReadWriteManager,_virtualDataSource);
8384
}
8485

8586
#region create db context
8687

8788
private IDataSourceDbContext GetDataSourceDbContext(string dataSourceName)
8889
{
89-
return _dbContextCaches.GetOrAdd(dataSourceName, dsname => new DataSourceDbContext(dsname, _virtualDataSource.IsDefault(dsname), _shardingDbContext, _dbContextCreator, _actualConnectionStringManager,_loggerFactory.CreateLogger<DataSourceDbContext>()));
90+
return _dbContextCaches.GetOrAdd(dataSourceName, dsname => new DataSourceDbContext(dsname, _virtualDataSource.IsDefault(dsname), _shardingDbContext, _dbContextCreator, _actualConnectionStringManager));
9091

9192
}
9293
/// <summary>
@@ -194,9 +195,20 @@ public void Rollback()
194195

195196
public void Commit()
196197
{
198+
int i = 0;
197199
foreach (var dbContextCache in _dbContextCaches)
198200
{
199-
dbContextCache.Value.Commit(_dbContextCaches.Count);
201+
try
202+
{
203+
dbContextCache.Value.Commit();
204+
}
205+
catch (Exception e)
206+
{
207+
_logger.LogError(e, "commit error.");
208+
if (i == 0)
209+
throw;
210+
}
211+
i++;
200212
}
201213

202214
AutoUseWriteConnectionString();
@@ -231,9 +243,20 @@ public void Dispose()
231243

232244
public async Task CommitAsync(CancellationToken cancellationToken = new CancellationToken())
233245
{
246+
int i = 0;
234247
foreach (var dbContextCache in _dbContextCaches)
235248
{
236-
await dbContextCache.Value.CommitAsync(_dbContextCaches.Count, cancellationToken);
249+
try
250+
{
251+
await dbContextCache.Value.CommitAsync(cancellationToken);
252+
}
253+
catch (Exception e)
254+
{
255+
_logger.LogError(e, "commit error.");
256+
if (i == 0)
257+
throw;
258+
}
259+
i++;
237260
}
238261

239262
AutoUseWriteConnectionString();

0 commit comments

Comments
 (0)