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
相关产品推荐
相关产品推荐

