You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET中Trans_Rollback运行触发Object reference not set to an instance of an object错误

错误触发原因

本次System.NullReferenceException空引用异常的根源是Trans_Rollback方法中的trans事务对象或con数据库连接对象未被初始化、或已经被提前释放导致引用为空,常见触发场景如下:

  • 事务初始化失败:比如数据库连接打开失败时,未给trans赋值就直接调用回滚方法
  • 对象已提前释放:调用Trans_Rollback前,事务已经被提交/释放,或者连接已经被关闭销毁,两个对象被置为null
  • 多线程冲突:多线程场景下共享trans或con对象,其他线程提前销毁了对象,导致当前线程取到空引用
修复方案

方案1:补充空值校验和异常捕获(适配现有代码结构)

修改Trans_Rollback方法,执行操作前先校验对象是否为空,同时捕获回滚过程中可能出现的事务已提交等异常:

public void Trans_Rollback()
{
    // 事务对象非空才执行回滚
    if (trans != null)
    {
        try
        {
            trans.Rollback();
        }
        catch (InvalidOperationException)
        {
            // 可根据业务需求记录异常日志,事务已被提交/释放的场景不需要重复抛出
        }
        finally
        {
            trans.Dispose();
            trans = null;
        }
    }
    // 连接对象非空且处于打开状态才执行关闭
    if (con != null && con.State == System.Data.ConnectionState.Open)
    {
        con.Close();
        con.Dispose();
        con = null;
    }
}

同时要在事务初始化阶段补充异常处理,避免初始化失败时直接调用回滚逻辑:

try
{
    con.Open();
    trans = con.BeginTransaction();
    // 后续业务逻辑代码
}
catch (Exception ex)
{
    Trans_Rollback();
    // 记录异常日志
    throw;
}

方案2:使用using语法自动管理生命周期(更推荐)

不需要手动维护回滚、关闭、释放逻辑,离开作用域后系统会自动销毁对象,从根源避免空引用问题:

using (var con = new SqlConnection("你的数据库连接字符串"))
{
    con.Open();
    using (var trans = con.BeginTransaction())
    {
        try
        {
            // 业务操作,注意所有执行的SQL命令都要绑定当前trans对象
            // 示例:sqlCommand.Transaction = trans;
            
            trans.Commit();
        }
        catch
        {
            trans.Rollback();
            throw;
        }
    }
}

内容的提问来源于stack exchange,提问作者Saurabh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:48:03