Browse Source

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

pull/7491/head
Halil İbrahim Kalkan 5 years ago
parent
commit
103b2117ab
  1. 31
      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. 2
      framework/src/Volo.Abp.Uow/Volo/Abp/Uow/ISupportsRollback.cs
  6. 21
      framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs

31
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;
using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Storage;
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Threading;
namespace Volo.Abp.Uow.EntityFrameworkCore namespace Volo.Abp.Uow.EntityFrameworkCore
{ {
@ -14,22 +15,22 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
public IEfCoreDbContext StarterDbContext { get; } public IEfCoreDbContext StarterDbContext { get; }
public List<IEfCoreDbContext> AttendedDbContexts { 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; DbContextTransaction = dbContextTransaction;
StarterDbContext = starterDbContext; StarterDbContext = starterDbContext;
CancellationTokenProvider = cancellationTokenProvider;
AttendedDbContexts = new List<IEfCoreDbContext>(); AttendedDbContexts = new List<IEfCoreDbContext>();
} }
public Task CommitAsync() public async Task CommitAsync()
{
Commit();
return Task.CompletedTask;
}
protected void Commit()
{ {
DbContextTransaction.Commit(); await DbContextTransaction.CommitAsync(CancellationTokenProvider.Token);
foreach (var dbContext in AttendedDbContexts) foreach (var dbContext in AttendedDbContexts)
{ {
@ -38,7 +39,7 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
continue; //Relational databases use the shared transaction 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(); DbContextTransaction.Dispose();
} }
public void Rollback()
{
DbContextTransaction.Rollback();
}
public Task RollbackAsync(CancellationToken cancellationToken) public Task RollbackAsync(CancellationToken cancellationToken)
{ {
DbContextTransaction.Rollback(); return DbContextTransaction.RollbackAsync(
return Task.CompletedTask; 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, transactionApiKey,
new EfCoreTransactionApi( new EfCoreTransactionApi(
dbtransaction, dbtransaction,
dbContext dbContext,
_cancellationTokenProvider
) )
); );
@ -212,7 +213,8 @@ namespace Volo.Abp.Uow.EntityFrameworkCore
transactionApiKey, transactionApiKey,
new EfCoreTransactionApi( new EfCoreTransactionApi(
dbTransaction, 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 System.Threading.Tasks;
using MongoDB.Driver; using MongoDB.Driver;
using Volo.Abp.Threading;
namespace Volo.Abp.Uow.MongoDB namespace Volo.Abp.Uow.MongoDB
{ {
@ -9,19 +9,19 @@ namespace Volo.Abp.Uow.MongoDB
{ {
public IClientSessionHandle SessionHandle { get; } public IClientSessionHandle SessionHandle { get; }
public MongoDbTransactionApi(IClientSessionHandle sessionHandle) protected ICancellationTokenProvider CancellationTokenProvider { get; }
public MongoDbTransactionApi(
IClientSessionHandle sessionHandle,
ICancellationTokenProvider cancellationTokenProvider)
{ {
SessionHandle = sessionHandle; SessionHandle = sessionHandle;
CancellationTokenProvider = cancellationTokenProvider;
} }
public async Task CommitAsync() public async Task CommitAsync()
{ {
await SessionHandle.CommitTransactionAsync(); await SessionHandle.CommitTransactionAsync(CancellationTokenProvider.Token);
}
protected void Commit()
{
SessionHandle.CommitTransaction();
} }
public void Dispose() public void Dispose()
@ -29,14 +29,11 @@ namespace Volo.Abp.Uow.MongoDB
SessionHandle.Dispose(); SessionHandle.Dispose();
} }
public void Rollback()
{
SessionHandle.AbortTransaction();
}
public async Task RollbackAsync(CancellationToken cancellationToken) 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( unitOfWork.AddTransactionApi(
transactionApiKey, transactionApiKey,
new MongoDbTransactionApi(session) new MongoDbTransactionApi(
session,
_cancellationTokenProvider
)
); );
dbContext.ToAbpMongoDbContext().InitializeDatabase(database, client, session); dbContext.ToAbpMongoDbContext().InitializeDatabase(database, client, session);
@ -215,7 +218,10 @@ namespace Volo.Abp.Uow.MongoDB
unitOfWork.AddTransactionApi( unitOfWork.AddTransactionApi(
transactionApiKey, transactionApiKey,
new MongoDbTransactionApi(session) new MongoDbTransactionApi(
session,
_cancellationTokenProvider
)
); );
dbContext.ToAbpMongoDbContext().InitializeDatabase(database, client, session); dbContext.ToAbpMongoDbContext().InitializeDatabase(database, client, session);

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

@ -5,8 +5,6 @@ namespace Volo.Abp.Uow
{ {
public interface ISupportsRollback public interface ISupportsRollback
{ {
void Rollback();
Task RollbackAsync(CancellationToken cancellationToken); 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) protected virtual async Task RollbackAllAsync(CancellationToken cancellationToken)
{ {
foreach (var databaseApi in GetAllActiveDatabaseApis()) foreach (var databaseApi in GetAllActiveDatabaseApis())

Loading…
Cancel
Save