【问题标题】:Instantiating TransactionScope returns null实例化 TransactionScope 返回 null
【发布时间】:2009-11-21 23:37:45
【问题描述】:

我有一些创建 TransactionScope 实例的 VB.NET 代码:

LoggingUtility.LogDebug("UpdateCallTable", "SatComCallDataImporter", "About to associate call data with contracts")
Using ts = New TransactionScope()
    LoggingUtility.LogDebug("UpdateCallTable", "SatComCallDataImporter", "Getting all unimported SatCom calls")

我的应用程序在调用创建新 TransactionScope 时抛出异常,“对象引用未设置为对象的实例。”。我的开发机器或测试机器上没有抛出异常;只在客户的生产机器上,我不知道为什么。我已经在这条线之前和之后放置了调试线,所以我很肯定是这条线导致了问题。

A 在整个应用程序中都使用了 TransactionScopes,这是在客户端计算机上引发异常的唯一地方。

“关于将调用数据与合同关联”被写入日志,下一个日志条目是“对象引用未设置为对象的实例”。

如果我将其移出事务,代码可以正常工作。

我已经为此苦苦挣扎了 4 天,而且还没有接近。

【问题讨论】:

  • 傻我。错误正在中止事务,所以我的调试日志当然没有被写入(到数据库)。实际原因是导入规范和正在导入的数据之间存在差异。一个永远不应该为空的字段实际上是空的。我从来没有在测试中选择它,因为我有一个正确的规范样本文件来测试,而不是真实数据。现在听起来太明显了。
  • ARgg,完成了那个。如果您尝试在“如果中止执行此操作”中添加一些逻辑,那么您最终会支持整个事情,那就更好了。仅供参考 New TransactionScope(TransactionScopeOption.Supress) 将允许您在当前事务之外对数据库执行操作。

标签: vb.net transactions transactionscope


【解决方案1】:

也许您对 MSDTC 有疑问?

虽然我更倾向于编码错误,因为 TransactionScope 对象应该被初始化且非 null,但它会指示错误。

也许向我们展示代码可能会进一步帮助我们?

更新:我有过日志引擎在异常之前未能记录该行的经验,这有时是由发布模式重新排序引起的,或者例程没有主动刷新并且应用程序在完成之前就崩溃了。

我建议在 using() 语句之后直接放置一个日志记录行,以断言 TransactionScope 不为空。鉴于您使用代码的方式,该代码的结果不可能返回 null,如果构造函数失败,则构造函数必须抛出异常,否则您的事务范围为非 null。

也许再多一点代码,这个测试可能会帮助更多?

【讨论】:

  • 如果有帮助,很高兴显示代码,但这是失败的代码行。周围的线是调试线。我检查了所有机器上的 MSDTC 设置,它们是相同的。
  • 实际上放入一行,声明 If IsNothing(ts) then throw new NullReferenceException() 在它周围添加一个 try catch !
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
相关资源
最近更新 更多