Browse Source

Resolved #7489: Async implementation for Transaction Commit/Rollback.

pull/7491/head
Halil İbrahim Kalkan 5 years ago
parent
commit
103b2117ab
  1. 33
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs
  2. 6
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs
  3. 27
      framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/MongoDbTransactionApi.cs
  4. 10
      framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs
  5. 4
      framework/src/Volo.Abp.Uow/Volo/Abp/Uow/ISupportsRollback.cs
  6. 21
      framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs

33
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs

@ -5,6 +5,7 @@ using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Threading;
namespace Volo.Abp.Uow.EntityFrameworkCore
{
@ -14,22 +15,22 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
public IEfCoreDbContext StarterDbContext { get; }
public List<IEfCoreDbContext> AttendedDbContexts { get; }
public EfCoreTransactionApi(IDbContextTransaction dbContextTransaction, IEfCoreDbContext starterDbContext)
protected ICancellationTokenProvider CancellationTokenProvider { get; }
public EfCoreTransactionApi(
IDbContextTransaction dbContextTransaction,
IEfCoreDbContext starterDbContext,
ICancellationTokenProvider cancellationTokenProvider)
{
DbContextTransaction = dbContextTransaction;
StarterDbContext = starterDbContext;
CancellationTokenProvider = cancellationTokenProvider;
AttendedDbContexts = new List<IEfCoreDbContext>();
}
public Task CommitAsync()
{
Commit();
return Task.CompletedTask;
}
protected void Commit()
public async Task CommitAsync()
{
DbContextTransaction.Commit();
await DbContextTransaction.CommitAsync(CancellationTokenProvider.Token);
foreach (var dbContext in AttendedDbContexts)
{
@ -38,7 +39,7 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
continue; //Relational databases use the shared transaction
}
dbContext.Database.CommitTransaction();
await dbContext.Database.CommitTransactionAsync(CancellationTokenProvider.Token);
}
}
@ -47,15 +48,11 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
DbContextTransaction.Dispose();
}
public void Rollback()
{
DbContextTransaction.Rollback();
}
public Task RollbackAsync(CancellationToken cancellationToken)
{
DbContextTransaction.Rollback();
return Task.CompletedTask;
return DbContextTransaction.RollbackAsync(
CancellationTokenProvider.FallbackToProvider(cancellationToken)
);
}
}
}
}

6
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs

@ -168,7 +168,8 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
transactionApiKey,
new EfCoreTransactionApi(
dbtransaction,
dbContext
dbContext,
_cancellationTokenProvider
)
);
@ -212,7 +213,8 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
transactionApiKey,
new EfCoreTransactionApi(
dbTransaction,
dbContext
dbContext,
_cancellationTokenProvider
)
);

27
framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/MongoDbTransactionApi.cs

@ -1,7 +1,7 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading;
using System.Threading.Tasks;
using MongoDB.Driver;
using Volo.Abp.Threading;
namespace Volo.Abp.Uow.MongoDB
{
@ -9,19 +9,19 @@ namespace Volo.Abp.Uow.MongoDB
{
public IClientSessionHandle SessionHandle { get; }
public MongoDbTransactionApi(IClientSessionHandle sessionHandle)
protected ICancellationTokenProvider CancellationTokenProvider { get; }
public MongoDbTransactionApi(
IClientSessionHandle sessionHandle,
ICancellationTokenProvider cancellationTokenProvider)
{
SessionHandle = sessionHandle;
CancellationTokenProvider = cancellationTokenProvider;
}
public async Task CommitAsync()
{
await SessionHandle.CommitTransactionAsync();
}
protected void Commit()
{
SessionHandle.CommitTransaction();
await SessionHandle.CommitTransactionAsync(CancellationTokenProvider.Token);
}
public void Dispose()
@ -29,14 +29,11 @@ namespace Volo.Abp.Uow.MongoDB
SessionHandle.Dispose();
}
public void Rollback()
{
SessionHandle.AbortTransaction();
}
public async Task RollbackAsync(CancellationToken cancellationToken)
{
await SessionHandle.AbortTransactionAsync(cancellationToken);
await SessionHandle.AbortTransactionAsync(
CancellationTokenProvider.FallbackToProvider(cancellationToken)
);
}
}
}

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

@ -178,7 +178,10 @@ namespace Volo.Abp.Uow.MongoDB
unitOfWork.AddTransactionApi(
transactionApiKey,
new MongoDbTransactionApi(session)
new MongoDbTransactionApi(
session,
_cancellationTokenProvider
)
);
dbContext.ToAbpMongoDbContext().InitializeDatabase(database, client, session);
@ -215,7 +218,10 @@ namespace Volo.Abp.Uow.MongoDB
unitOfWork.AddTransactionApi(
transactionApiKey,
new MongoDbTransactionApi(session)
new MongoDbTransactionApi(
session,
_cancellationTokenProvider
)
);
dbContext.ToAbpMongoDbContext().InitializeDatabase(database, client, session);

4
framework/src/Volo.Abp.Uow/Volo/Abp/Uow/ISupportsRollback.cs

@ -5,8 +5,6 @@ namespace Volo.Abp.Uow
{
public interface ISupportsRollback
{
void Rollback();
Task RollbackAsync(CancellationToken cancellationToken);
}
}
}

21
framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs

@ -262,27 +262,6 @@ namespace Volo.Abp.Uow
}
}
protected virtual void RollbackAll()
{
foreach (var databaseApi in GetAllActiveDatabaseApis())
{
try
{
(databaseApi as ISupportsRollback)?.Rollback();
}
catch { }
}
foreach (var transactionApi in GetAllActiveTransactionApis())
{
try
{
(transactionApi as ISupportsRollback)?.Rollback();
}
catch { }
}
}
protected virtual async Task RollbackAllAsync(CancellationToken cancellationToken)
{
foreach (var databaseApi in GetAllActiveDatabaseApis())

Loading…
Cancel
Save