4

我一直在使用 Oracle 10g 数据库开发一个 winform 应用程序,该应用程序正在使用TransactionScope并想要修改 machine.config 文件中指定的maxTimeOut,我的machine.config文件位于以下位置(我为此应用程序使用 .net 4)

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config 

最初没有指定任何maxTimeOut内容,因此默认为 10 分钟。为了改变它,我添加了maxTimeout="00:00:10"如下所示的值:

    <sectionGroup name="system.transactions" type="System.Transactions.Configuration.TransactionsSectionGroup, System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null">
        <section name="defaultSettings" type="System.Transactions.Configuration.DefaultSettingsSection, System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null"/>
        <section name="machineSettings" type="System.Transactions.Configuration.MachineSettingsSection, System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null" allowDefinition="MachineOnly" allowExeDefinition="MachineOnly" maxTimeout="00:00:10"/>
    </sectionGroup>

我重新启动了 PC 并运行了一个持续时间比这更长的测试 - 但事务似乎在 10 秒后没有中止,而是scopeOption.TimeOut使用 TransactionScopeOption 参数中指定的值(即 5 分钟)并且事务在 5 分钟后超时.

我是否将 maxTimeout 值包含在上面的正确位置?文件中有什么需要更改的吗?为什么没有使用 machine.config 中的 maxTimeout 值?

谢谢

4

3 回答 3

24

它没有被拾取的原因是因为 maxTimeOut 值应该放在 machine.config 文件的末尾,就在关闭配置标记之前。一旦我这样做了,它就开始工作了。

<configuration>
    <!-- Other configuration sections-->
    <system.transactions>
        <machineSettings maxTimeout="01:00:00" />
    </system.transactions>
</configuration> 
于 2013-04-30T20:10:13.823 回答
2

尝试在 32 位机器配置中设置值

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config 

可能是为 x86 编译设置了 winforms。还要检查是否没有要设置的 odac 事务超时设置和程序集。

于 2013-04-29T14:37:08.733 回答
0

您可以使用 s_maximumTimeouts_cachedMaxTimeout覆盖该值

Type oSystemType = typeof(global::System.Transactions.TransactionManager);
System.Reflection.FieldInfo oCachedMaxTimeout = 
                    oSystemType.GetField("_cachedMaxTimeout", 
                    System.Reflection.BindingFlags.NonPublic | 
                    System.Reflection.BindingFlags.Static);
System.Reflection.FieldInfo oMaximumTimeout = 
                    oSystemType.GetField("_maximumTimeout", 
                    System.Reflection.BindingFlags.NonPublic | 
                    System.Reflection.BindingFlags.Static);
oCachedMaxTimeout.SetValue(null, true);
oMaximumTimeout.SetValue(null, TimeSpan.FromSeconds(2400));
于 2020-11-05T08:15:27.817 回答