kingyuzhe 2024-01-11 11:16 采纳率: 0%
浏览 5

EF DBContextTransaction 事务回滚未生效

EFCode DBContextTransaction事务拦截是成功的,也能执行到回滚那一步,但是 事务回滚未生效?

调用事务的方法

       [UnitOfWork]
        public async Task CreateTableAndMenuAsync(string module, IList<Menu> menus)
        {


            await _moduleInstallService.AddAsync(new ModuleInstall { Code = module });
            await _repository.CreateTableAndMenuAsync(module, menus);


        }
事务拦截执行
public class UnitOfWorkAttribute : AbstractInterceptorAttribute
    {
        public override async Task Invoke(AspectContext context, AspectDelegate next)
        {
            var unitOfWork = context.ServiceProvider.GetService<IUnitOfWork>();
            if (unitOfWork != null)
            {

                try
                {
                    await unitOfWork.BeginTransactionAsync();
                    await next(context);
                    await unitOfWork.CommitTransactionAsync();
                }
                catch (Exception ex)
                {
                    await unitOfWork.RollbackTransactionAsync();
                    throw;
                }
            }
            else
            {
                await next(context);
            }

        }
    }

事务实现

public async Task BeginTransactionAsync(CancellationToken cancellationToken = default)
        {
            await Database.BeginTransactionAsync(cancellationToken);
        }

       

        public async Task CommitTransactionAsync(CancellationToken cancellationToken = default)
        {
            await Database.CommitTransactionAsync(cancellationToken);
        }


public async Task RollbackTransactionAsync(CancellationToken cancellationToken = default)
        {
            await Database.RollbackTransactionAsync(cancellationToken);

        }
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-01-11 14:23
    关注

    【以下回答由 GPT 生成】

    这个问题可能是由于事务未正确管理引起的。根据你提供的代码,我无法确切确定问题的根本原因。不过,我可以提供一些可能的解决方案和调试步骤来帮助你找到问题。

    1. 首先,确保你的数据库提供程序支持事务。如果你使用的是常见的关系型数据库,如SQL Server、MySQL或Oracle等,那么它们应该支持事务。请确保你使用的数据库提供程序和配置文件正确设置了事务支持。

    2. 确保每个方法都在同一个DBContext实例中进行操作。在你的UnitOfWorkAttribute中,你可以使用DBContextResolver或指定的依赖注入容器来获取DBContext实例。确保在同一个DBContext实例上执行操作,并确保在同一个实例上调用CommitTransactionAsync和RollbackTransactionAsync方法。

    因为你的事务在UnitOfWorkAttribute中开始和结束,所以可以使用DbContextOptions来创建DBContext实例,而不是从DI容器中直接解析。

    1. 调试代码,添加日志语句以确保事务的各个部分被正确执行。在你的UnitOfWorkAttribute和事务实现方法中添加日志语句,以获取更多有关问题的信息。例如,在BeginTransactionAsync、CommitTransactionAsync和RollbackTransactionAsync方法中,可以添加类似于Console.WriteLine或ILogger的日志语句,以记录事务的执行情况。

    可以使用以下示例代码作为参考,将日志语句添加到你的代码中:

    public async Task BeginTransactionAsync(CancellationToken cancellationToken = default)
    {
        Console.WriteLine("BeginTransactionAsync called");
        await Database.BeginTransactionAsync(cancellationToken);
        Console.WriteLine("Transaction started");
    }
    
    public async Task CommitTransactionAsync(CancellationToken cancellationToken = default)
    {
        Console.WriteLine("CommitTransactionAsync called");
        await Database.CommitTransactionAsync(cancellationToken);
        Console.WriteLine("Transaction committed");
    }
    
    public async Task RollbackTransactionAsync(CancellationToken cancellationToken = default)
    {
        Console.WriteLine("RollbackTransactionAsync called");
        await Database.RollbackTransactionAsync(cancellationToken);
        Console.WriteLine("Transaction rolled back");
    }
    

    使用这些日志语句,可以确定事务是否真正开始、提交或回滚。

    1. 检查你的数据访问代码是否正确执行事务。在你的CreateTableAndMenuAsync方法中,确保调用数据库上下文的SaveChangesAsync方法来保存对数据库的更改。如果你忘记调用SaveChangesAsync方法,那么即使事务被正确启动和回滚,对数据库的更改仍然会被提交。

    在你的CreateTableAndMenuAsync方法中,添加下面的代码:

    [UnitOfWork]
    public async Task CreateTableAndMenuAsync(string module, IList<Menu> menus)
    {
        await _moduleInstallService.AddAsync(new ModuleInstall { Code = module });
        await _repository.CreateTableAndMenuAsync(module, menus);
    
        await _dbContext.SaveChangesAsync();
    }
    

    这样可以确保调用SaveChangesAsync方法来保存更改。

    1. 最后,确保你的数据库连接字符串配置正确,并且数据库具有足够的权限来执行事务。检查数据库连接字符串中的用户名、密码和数据库名称等信息是否正确,并确保用户具有执行事务所需的权限。

    这些是一些可能的解决方案和调试步骤,以帮助你诊断和解决事务回滚未生效的问题。如果以上步骤都不能解决问题,可能需要更详细地检查你的代码和环境配置。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 1月11日

悬赏问题

  • ¥15 (需要远程,AI不回)VB6二进制文件转换成功,但是C#转换总是失败
  • ¥15 关于#matlab#的问题:有没有什么其他办法能够保证不退出进程(相关搜索:matlab调用)
  • ¥15 依据报错在原代吗格式的基础上解决问题
  • ¥15 在虚拟机中安装flash code
  • ¥15 单片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码
  • ¥20 verilog状态机方法流水灯
  • ¥15 pandas代码实现不了意图
  • ¥15 GD32H7 从存储器到外设SPI传输数据无法重复启用DMA
  • ¥25 LT码在高斯信道下的误码率仿真
  • ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作