该操作对多线程更新的事务超时异常状态无效

时间:2013-11-27 06:46:54

标签: multithreading wcf transactions timeout transactionscope

我正在使用以下交易

var transactionScopeOptions = new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUncommitted, Timeout = Timeout = new TimeSpan(0, 10, 0) };
using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionScopeOptions))
{
     /* update query here with data context execute command */
}

我持续该操作对于交易状态例外无效,内部例外情况为交易超时

在本地,我只获得10万分之一的机会,但在服务器中它偶尔会发生。该应用程序在MSMQ和WCF上运行。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
                     ConcurrencyMode = ConcurrencyMode.Multiple)]

我尝试了以下内容:

<system.transactions>
  <machineSettings maxTimeout="02:00:00" />
</system.transactions>

并将dataContext.CommandTimeout设置为1小时或0(无限)。 在app.config

中更改了连接超时= 3600

我已经尝试了几乎所有我在谷歌上阅读但仍然没有运气的东西。希望我能在服务器中删除此问题。

注意:更新查询通常持续0到20秒(最大值),但由于它是多线程的,因此会导致错误。如果我在异常中运行那些,它似乎不再得到错误,因为事务没有超时。

修改

我的所有查询都有脏读(nolock用于读取和rowlock用于更新)

编辑:

组件服务&gt;我的电脑&gt;选项&gt;交易超时(秒):600 然后在服务中重新启动“Distributed Transaction Coordinator”。

仍然没有运气

修改

在进入transactionScope时添加了时间戳,当获得异常(Transaction TimeOut)时,它似乎并没有真正超时相关,因为它在进入事务范围后不到一分钟就被踢出(当我已经指定了事务时)在10分钟内抽出时间。)

这意味着它只是发出了Transaction TimeOut异常,即使它确实没有超时。

修改

根据上一个错误,我尝试将以下based from this website添加到我的连接字符串中:

Transaction Binding=Explicit Unbind

虽然我使用的是SQL Server 2012和最新的Visual Studio Framework,但不确定它是否有用。

修改

我也有以下内容:

在app config中:

<system.transactions>
    <defaultSettings timeout="2:00:00" />
</system.transactions>

绑定服务:

<binding  name="FooBinding"
                  deadLetterQueue="System"
                  maxReceivedMessageSize="524288"
                  exactlyOnce="true"
                  receiveErrorHandling="Move"
                  retryCycleDelay="00:00:30"
                  maxRetryCycles="120"
                  receiveRetryCount="0"
                  sendTimeout="00:01:00">

<serviceTimeouts transactionTimeout="00:10:00" />

修改

我尝试将配置更改为以下内容,希望它是WCF超时(默认为1分钟),但仍然会获得以下异常:(将超时延长到10分钟)

<binding  name="FooBinding"
                      deadLetterQueue="System"
                      maxReceivedMessageSize="524288"
                      exactlyOnce="true"
                      receiveErrorHandling="Move"
                      retryCycleDelay="00:00:30"
                      maxRetryCycles="120"
                      receiveRetryCount="0"
                      closeTimeout="00:10:00"
                      openTimeout="00:10:00"
                      receiveTimeout="00:10:00"
                      sendTimeout="00:10:00" />

我在另一个链接中询问了related question with some code logic

0 个答案:

没有答案