From 103b2117abb33eac3a02db6fff0a9c656d1d4cbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 28 Jan 2021 09:39:29 +0300 Subject: [PATCH] Resolved #7489: Async implementation for Transaction Commit/Rollback. --- .../EfCoreTransactionApi.cs | 33 +++++++++---------- .../UnitOfWorkDbContextProvider.cs | 6 ++-- .../Abp/Uow/MongoDB/MongoDbTransactionApi.cs | 27 +++++++-------- .../UnitOfWorkMongoDbContextProvider.cs | 10 ++++-- .../Volo/Abp/Uow/ISupportsRollback.cs | 4 +-- .../Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs | 21 ------------ 6 files changed, 40 insertions(+), 61 deletions(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs index 99622dda96..625ba72ee2 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs +++ b/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 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(); } - 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) + ); } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs index 564a3ef8ad..49abdced36 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs +++ b/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 ) ); diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/MongoDbTransactionApi.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/MongoDbTransactionApi.cs index 6c3ab76ee5..f376c2f804 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/MongoDbTransactionApi.cs +++ b/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) + ); } } } diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs index 2b279f9c37..a7c4691f47 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs +++ b/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); diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/ISupportsRollback.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/ISupportsRollback.cs index 4c211d652d..2286a386b8 100644 --- a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/ISupportsRollback.cs +++ b/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); } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs index 955fa6b449..878c03d629 100644 --- a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs +++ b/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())