Browse Source

Add `CancellationToken` to `ITransactionApi`.

Resolve #16646
pull/16660/head
maliming 3 years ago
parent
commit
90d246fd7e
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 6
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs
  2. 4
      framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/MongoDbTransactionApi.cs
  3. 2
      framework/src/Volo.Abp.Uow/Volo/Abp/Uow/ISupportsRollback.cs
  4. 3
      framework/src/Volo.Abp.Uow/Volo/Abp/Uow/ITransactionApi.cs
  5. 6
      framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWork.cs
  6. 29
      framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Uow/UnitOfWork_CancellationToken_Tests.cs
  7. 31
      framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Uow/UnitOfWork_CancellationToken_Tests.cs

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

@ -28,7 +28,7 @@ public class EfCoreTransactionApi : ITransactionApi, ISupportsRollback
AttendedDbContexts = new List<IEfCoreDbContext>();
}
public async Task CommitAsync()
public async Task CommitAsync(CancellationToken cancellationToken = default)
{
foreach (var dbContext in AttendedDbContexts)
{
@ -38,10 +38,10 @@ public class EfCoreTransactionApi : ITransactionApi, ISupportsRollback
continue; //Relational databases use the shared transaction if they are using the same connection
}
await dbContext.Database.CommitTransactionAsync(CancellationTokenProvider.Token);
await dbContext.Database.CommitTransactionAsync(CancellationTokenProvider.FallbackToProvider(cancellationToken));
}
await DbContextTransaction.CommitAsync(CancellationTokenProvider.Token);
await DbContextTransaction.CommitAsync(CancellationTokenProvider.FallbackToProvider(cancellationToken));
}
public void Dispose()

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

@ -19,9 +19,9 @@ public class MongoDbTransactionApi : ITransactionApi, ISupportsRollback
CancellationTokenProvider = cancellationTokenProvider;
}
public async Task CommitAsync()
public async Task CommitAsync(CancellationToken cancellationToken)
{
await SessionHandle.CommitTransactionAsync(CancellationTokenProvider.Token);
await SessionHandle.CommitTransactionAsync(CancellationTokenProvider.FallbackToProvider(cancellationToken));
}
public void Dispose()

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

@ -5,5 +5,5 @@ namespace Volo.Abp.Uow;
public interface ISupportsRollback
{
Task RollbackAsync(CancellationToken cancellationToken);
Task RollbackAsync(CancellationToken cancellationToken = default);
}

3
framework/src/Volo.Abp.Uow/Volo/Abp/Uow/ITransactionApi.cs

@ -1,9 +1,10 @@
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Volo.Abp.Uow;
public interface ITransactionApi : IDisposable
{
Task CommitAsync();
Task CommitAsync(CancellationToken cancellationToken = default);
}

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

@ -158,7 +158,7 @@ public class UnitOfWork : IUnitOfWork, ITransientDependency
await SaveChangesAsync(cancellationToken);
}
await CommitTransactionsAsync();
await CommitTransactionsAsync(cancellationToken);
IsCompleted = true;
await OnCompletedAsync();
}
@ -363,11 +363,11 @@ public class UnitOfWork : IUnitOfWork, ITransientDependency
}
}
protected virtual async Task CommitTransactionsAsync()
protected virtual async Task CommitTransactionsAsync(CancellationToken cancellationToken)
{
foreach (var transaction in GetAllActiveTransactionApis())
{
await transaction.CommitAsync();
await transaction.CommitAsync(cancellationToken);
}
}

29
framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Uow/UnitOfWork_CancellationToken_Tests.cs

@ -0,0 +1,29 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.TestApp.Domain;
using Volo.Abp.Uow;
using Xunit;
namespace Volo.Abp.EntityFrameworkCore.Uow;
public class UnitOfWork_CancellationToken_Tests : EntityFrameworkCoreTestBase
{
[Fact]
public async Task Should_Cancel_Test()
{
using (var uow = GetRequiredService<IUnitOfWorkManager>().Begin(isTransactional: true))
{
await Assert.ThrowsAsync<TaskCanceledException>(async () =>
{
var cst = new CancellationTokenSource();
cst.Cancel();
await GetRequiredService<IBasicRepository<Person, Guid>>().InsertAsync(new Person(Guid.NewGuid(), "Adam", 42));
await uow.CompleteAsync(cst.Token);
});
}
}
}

31
framework/test/Volo.Abp.MongoDB.Tests/Volo/Abp/MongoDB/Uow/UnitOfWork_CancellationToken_Tests.cs

@ -0,0 +1,31 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.TestApp.Domain;
using Volo.Abp.TestApp.Testing;
using Volo.Abp.Uow;
using Xunit;
namespace Volo.Abp.MongoDB.Uow;
[Collection(MongoTestCollection.Name)]
public class UnitOfWork_CancellationToken_Tests : TestAppTestBase<AbpMongoDbTestModule>
{
[Fact]
public async Task Should_Cancel_Test()
{
using (var uow = GetRequiredService<IUnitOfWorkManager>().Begin(isTransactional: true))
{
await Assert.ThrowsAsync<OperationCanceledException>(async () =>
{
var cst = new CancellationTokenSource();
cst.Cancel();
await GetRequiredService<IBasicRepository<Person, Guid>>().InsertAsync(new Person(Guid.NewGuid(), "Adam", 42));
await uow.CompleteAsync(cst.Token);
});
}
}
}
Loading…
Cancel
Save