C# 了解transactionscope超时
我目前对transactionscope超时的理解 如果事务的运行时间超过了设置的超时时间,则在 调用transaction.complete()。因此,如果事务中的处理一直在进行 对于X分钟,我们仍然必须等待X分钟,然后调用transaction.complete 在我们的例子中,我们从web服务中使用transactionscope—web请求的最终用户 在事务中止和异常冒泡返回之前,必须等待X分钟 但是,HttpWebRequest的默认超时为100秒(根据msdn)。自从客户时代以来 100秒后,我们在transactionscope中有一分钟的超时。这确保了数据库的一致性 我对超时的理解正确吗 问题:我们希望尽可能减少最终用户了解交易结果所需的时间。为了最大限度地减少延迟,我们决定使用嵌套的TransactionScope拆分代码——每个都有15秒的超时时间。如果子事务花费的时间超过15秒,我们将整个事务中止 这里似乎忽略了子事务的超时。我只有在考试结束后才得到一个例外 调用父事务的超时。在以下代码中,ChildTransaction()始终返回true。 建议采用什么方法来最小化延迟代码显示1分钟的默认超时,以便代码更干净C# 了解transactionscope超时,c#,asp.net,sql-server-2008,transactionscope,C#,Asp.net,Sql Server 2008,Transactionscope,我目前对transactionscope超时的理解 如果事务的运行时间超过了设置的超时时间,则在 调用transaction.complete()。因此,如果事务中的处理一直在进行 对于X分钟,我们仍然必须等待X分钟,然后调用transaction.complete 在我们的例子中,我们从web服务中使用transactionscope—web请求的最终用户 在事务中止和异常冒泡返回之前,必须等待X分钟 但是,HttpWebRequest的默认超时为100秒(根据msdn)。自从客户时代以来 1
internal bool RootTransaction()
{
using (TransactionScope transaction = new TransactionScope())
{
try
{
bool result = ChildTransaction();
//The result is always true.
if (!result)
return result;
for (int counter = 0;counter <= 10;counter++)
{
//Either sleep OR do some processing
System.Threading.Thread.Sleep(5000);
//
//Dosomeprocess()
}
transaction.Complete();
return true;
}
catch (Exception e)
{
return false;
}
}
}
internal bool ChildTransaction()
{
using (TransactionScope transaction = new TransactionScope())
{
try
{
//Sleep for 70 seconds
System.Threading.Thread.Sleep(70000);
transaction.Complete();
}
catch (Exception e)
{
return false;
}
}
return true;
}
内部bool RootTransaction()
{
使用(TransactionScope transaction=new TransactionScope())
{
尝试
{
bool result=ChildTransaction();
//结果总是正确的。
如果(!结果)
返回结果;
对于(int counter=0;counter请尝试这样看:
事务的长度仅在调用trans.Complete()或退出事务作用域时确定。请使用以下代码:
using (var trans= new TransactionScope())
{
Threading.Sleep(99999);
trans.Complete()
}
在睡眠例程中没有方法抛出超时异常,如果抛出,也没有意义。因此,使用事务超时(至少以这种方式)只能保证,如果事务花费的时间超过超时时间,则不会提交
如果您只是执行一个查询(我不知道您使用事务的目的是什么),那么您可以设置查询/命令超时(或您所称的任何超时)。IIRC,您的查询将在超时过期后立即返回
另一种方法是设置web服务请求超时,并假设web服务由于事务中的任何内容而花费了太长的时间来响应
编辑:
你可以试试:
- 在另一个线程上生成事务,然后等待它在主线程(webservice调用使用的线程)上完成(使用thread.Join(timeout))。因此,如果它没有在指定的超时之前终止,则可以停止等待并返回超时错误(别忘了通知另一个线程中止事务)
- 假设您只在这些事务中执行SQL查询,您可以使用“BeginTransaction”关键字在SQL脚本中指定事务(hacky)。然后,您可以只指定命令超时,并在一行代码中执行所有这些操作。但是,这要求您将在事务中执行的所有操作都移动到一个sql脚本中,这对您来说可能是可能的,也可能是不可能的……而且它不是干净的
用真/假返回码替换异常几乎从来都不是一个好主意。我可以澄清一下:您是否将事务作为web服务调用的一部分使用?此类分布式事务可能真的很致命。或者该事务是web服务实现的本地事务?否。这些事务不是web服务调用的一部分。web服务注释只是设置上下文。服务是原子的,其中一些服务处理需要事务的数据插入。此外,true false仅用于测试目的。我们有单独的日志框架等用于例外。K.对于记录,我不确定我是否会期望子事务得到尊重。最外层的事务使用TS进行操作规则。但超时不应加倍;如果超时为X秒,则它是从第一次执行任何操作开始的X秒,而不是在调用时的X秒,然后是X秒。但这有点棘手,因为在您的示例中,您似乎没有涉及任何事务处理的资源,这使得很难谈论特定的行为。But超时发生在事务本身,而不是操作上。超时正常。默认情况下,如果整个事务花费的时间超过一分钟,它将被中止。我的问题-1)如果子事务本身花费的时间超过一分钟,则不会引发异常2)只有在提交事务时才会检查事务超时(根据其处理情况,可能需要一分钟以上)。建议如何最大限度地减少最终用户的等待时间?我需要最终用户在15秒内返回结果。因此,我将trans拆分为嵌套的trans,超时时间为15秒。看起来不尊重子trans超时。