diff --git a/Examples/aspnetcore_transaction/Controllers/HomeController.cs b/Examples/aspnetcore_transaction/Controllers/HomeController.cs index 4409056a..c979e628 100644 --- a/Examples/aspnetcore_transaction/Controllers/HomeController.cs +++ b/Examples/aspnetcore_transaction/Controllers/HomeController.cs @@ -70,9 +70,9 @@ namespace aspnetcore_transaction.Controllers _repoSong2.Insert(new Song()); } [Transactional(Propagation = Propagation.Nested)] //sqlite 不能嵌套事务,会锁库的 - async public Task Test11() + public Task Test11() { - await Task.Delay(TimeSpan.FromSeconds(10)).ContinueWith(t => + return Task.Delay(TimeSpan.FromSeconds(1)).ContinueWith(t => _repoSong.InsertAsync(new Song())); } diff --git a/Examples/aspnetcore_transaction/TransactionalAttribute.cs b/Examples/aspnetcore_transaction/TransactionalAttribute.cs index 5c9b5a53..f37a1a3b 100644 --- a/Examples/aspnetcore_transaction/TransactionalAttribute.cs +++ b/Examples/aspnetcore_transaction/TransactionalAttribute.cs @@ -4,6 +4,7 @@ using Rougamo.Context; using System; using System.Collections.Generic; using System.Data; +using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -18,8 +19,7 @@ namespace FreeSql IsolationLevel? m_IsolationLevel; static AsyncLocal m_ServiceProvider = new AsyncLocal(); - public static void SetServiceProvider(IServiceProvider serviceProvider) => - m_ServiceProvider.Value = serviceProvider; + public static void SetServiceProvider(IServiceProvider serviceProvider) => m_ServiceProvider.Value = serviceProvider; IUnitOfWork _uow; public override void OnEntry(MethodContext context) @@ -29,14 +29,24 @@ namespace FreeSql } public override void OnExit(MethodContext context) { - try + if (typeof(Task).IsAssignableFrom(context.RealReturnType)) { - if (context.Exception == null) _uow.Commit(); - else _uow.Rollback(); + ((Task)context.ReturnValue).ContinueWith(t => _OnExit()); + return; } - finally + _OnExit(); + + void _OnExit() { - _uow.Dispose(); + try + { + if (context.Exception == null) _uow.Commit(); + else _uow.Rollback(); + } + finally + { + _uow.Dispose(); + } } } }