From bfb896dc3f3533aeae9c662ab50b6c48faa10111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 29 Jan 2021 15:28:34 +0300 Subject: [PATCH] Rollback non-relational database transactions. Also, added comment to clarify it. --- .../EntityFrameworkCore/EfCoreTransactionApi.cs | 16 ++++++++++++---- .../UnitOfWorkDbContextProvider.cs | 10 ++++++++-- 2 files changed, 20 insertions(+), 6 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 625ba72ee2..a5c57b8597 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 @@ -48,11 +48,19 @@ namespace Volo.Abp.Uow.EntityFrameworkCore DbContextTransaction.Dispose(); } - public Task RollbackAsync(CancellationToken cancellationToken) + public async Task RollbackAsync(CancellationToken cancellationToken) { - return DbContextTransaction.RollbackAsync( - CancellationTokenProvider.FallbackToProvider(cancellationToken) - ); + await DbContextTransaction.RollbackAsync(CancellationTokenProvider.FallbackToProvider(cancellationToken)); + + foreach (var dbContext in AttendedDbContexts) + { + if (dbContext.As().HasRelationalTransactionManager()) + { + continue; //Relational databases use the shared transaction + } + + await dbContext.Database.RollbackTransactionAsync(CancellationTokenProvider.Token); + } } } } 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 dee4d3444d..89cc69fb74 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 @@ -191,7 +191,10 @@ namespace Volo.Abp.Uow.EntityFrameworkCore } else { - dbContext.Database.BeginTransaction(); //TODO: Why not using the new created transaction? + /* No need to store the returning IDbContextTransaction for non-relational databases + * since EfCoreTransactionApi will handle the commit/rollback over the DbContext instance. + */ + dbContext.Database.BeginTransaction(); } activeTransaction.AttendedDbContexts.Add(dbContext); @@ -236,7 +239,10 @@ namespace Volo.Abp.Uow.EntityFrameworkCore } else { - await dbContext.Database.BeginTransactionAsync(GetCancellationToken()); //TODO: Why not using the new created transaction? + /* No need to store the returning IDbContextTransaction for non-relational databases + * since EfCoreTransactionApi will handle the commit/rollback over the DbContext instance. + */ + await dbContext.Database.BeginTransactionAsync(GetCancellationToken()); } activeTransaction.AttendedDbContexts.Add(dbContext);