5.9K Star 11.6K Fork 4K

GVPdotNET China / Furion

 / 详情

使用unitofwork提交事务,可以提交成功,但是系统会有错误

已完成
创建于  
2021-06-30 16:07

特别说明:如果 Issue 报告为问题且开发成员回复确认问题之后但三天内都不能得到反馈,则视为无效Issue。

Furion 版本号

2.10.7


Web 项目类型

  • WebApi
  • Mvc
  • Razor Pages
  • Blazor Server

描述你的问题

如下代码 Test 方法
手动开启事务可以成功,
Test1方法使用unitofwork方法,则方法提交数据库成功,但是会被异常拦截器拦截到如下错误信息
并提示“Already committed or rolled back”

异常堆栈信息

at MySqlConnector.MySqlTransaction.VerifyValid() in //src/MySqlConnector/MySqlTransaction.cs:line 260
at MySqlConnector.MySqlTransaction.d__2.MoveNext() in /
/src/MySqlConnector/MySqlTransaction.cs:line 38
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MySqlConnector.MySqlTransaction.Commit() in /_/src/MySqlConnector/MySqlTransaction.cs:line 21
at Microsoft.EntityFrameworkCore.Storage.RelationalTransaction.Commit()
at Furion.DatabaseAccessor.DbContextPool.CommitTransaction(Boolean isManualSaveChanges, Exception exception, Boolean withCloseAll)
at Furion.DatabaseAccessor.UnitOfWorkFilter.d__6.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<g__Awaited|10_0>d.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<g__Awaited|25_0>d.MoveNext()

代码或代码仓库

    [HttpPost("upload11")]
    [ManualCommit]
    public async Task Test()
    {
        using (var transaction = _removalOrderRep.Context.Database.BeginTransaction())
        {
            try
            {                    
                var sku = _removalOrderRep.Change<Sku>().FirstOrDefault();
                sku.BarCode = "你好啊";
                await _removalOrderRep.Context.SaveChangesAsync();
                transaction.Commit();
            }
            catch(Exception ex)
            {
                transaction.Rollback();
                throw ex;
            }
        }
        //Task.CompletedTask;
    }

    [HttpPost("upload")]
    [UnitOfWork]
    public async Task Test1(RemovalOrderUploadDetailInput input)
    {
        var sku = _removalOrderRep.Change<Sku>().FirstOrDefault();
        sku.BarCode = "你好啊";
        await _removalOrderRep.Context.SaveChangesAsync();
        //Task.CompletedTask;
    }

数据库信息

  • [] Sqlite
  • SqlServer
  • [X ] Mysql
  • Oracle
  • PGSql
  • Firebird
  • Cosmos

期待结果

期待的结果是?


评论 (4)

yibey 创建了任务
yibey 关联仓库设置为dotNET China/Furion
展开全部操作日志

我建议建议不要把 Issue 当作你项目解决问题的方式,经过测试这个功能完全正常,我建议建议熟读文档或者调试源码,实在没办法解决才来发 Issue,不能遇到一个问题就直接发一个 Issue。

另外,我还得去模拟你的测试环境。你的测试代码,还得揣测你的各种用法,非常耗时。也建议你下次可以提供 Git 测试地址,我直接 Clone 代码下来直接就可以测试了。

好的

调试源码后发现是因为 services.AddDatabaseAccessor 不小心写了两遍,因此 UnitOfWorkFilter 过滤器也调用了两次
最后变成先入 UnitOfWorkFilter1 =》next=》 UnitOfWorkFilter2 =》next=》进入方法=》UnitOfWorkFilter2 提交完成=》UnitOfWorkFilter1 提交完成, UnitOfWorkFilter2 已经提交过事务, 这个时候UnitOfWorkFilter1 再次提交事务的时候, 则提示“Already committed or rolled back”。 :sweat_smile: :sweat_smile: :sweat_smile:

百小僧 任务状态待办的 修改为已完成
百小僧 负责人设置为百小僧
百小僧 添加了
 
无法重现
标签
百小僧 添加了
 
疑问
标签
百小僧 里程碑设置为Furion 2021
百小僧 关联分支设置为master
百小僧 计划截止日期设置为2021-06-30
百小僧 计划开始日期设置为2021-06-30
百小僧 关联分支master 修改为未关联

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
974299 monksoul 1578937227
C#
1
https://gitee.com/dotnetchina/Furion.git
git@gitee.com:dotnetchina/Furion.git
dotnetchina
Furion
Furion

搜索帮助