问个技术问题,求高人指点。

zhlin3415058 2010-10-31 04:47:16
怎么让业务停止一段时间再继续执行,不是进程休眠!!!
举例说明: 比如我有个函数,里面有事务操作,我想在打开事务之后,让程序停止一段时间(停止时间内可执行其它操作),然后再提交事务 ,我主要想测试事务过期时间问题。

PS:
首先休眠不能达到测试目的,不管我休眠多长时间,进程会被休眠掉,休眠终止后事务仍然能提交成功而不过期。

另外我尝试用定时器控制了下,我把定时器插在事务提交之前,但是定时器在打开之后,程序并不是等定时器关闭后函数再return,求高人指点,小弟不甚感激。



...全文
212 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhlin3415058 2010-11-02
  • 打赏
  • 举报
回复
虽然问题至今没有彻底解决,但还是感谢各位给我的指点,特别是要感谢[sp1234]大哥,这两天我也优化了一些业务,目前来说情况有所改善,也找出了问题原因根本所在,但也是一个困惑,接下来我会在新的帖子中提出我的问题,再次谢谢各位。
zy_cl 2010-11-01
  • 打赏
  • 举报
回复
就用计时器就可以了啊。你可以看看java的计时器,我觉得应该可以解决的
哥子谭 2010-10-31
  • 打赏
  • 举报
回复
的确,学习
zhlin3415058 2010-10-31
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 sp1234 的回复:]
其实这就跟我举的卖火车票的例子类似,我们可以微微修改业务流程,我们可以把火车票从待售车票的表中转移到正在销售的表中,然后假设5分钟还没有被真正销售出去我们再把它转回待售车票中继续销售。这样就不需要事务了,因为我们用数据结构的变化来代替了长时间加锁的问题。
[/Quote]

谢谢你的指点,我刚刚又仔细检查了一下业务,确实有很多地方需要优化,因为之前业务都不是我写的,我目前是作后期维护,所以碰倒一些问题都比较头疼。请教最后一个问题,关于事务超时,导致服务业务崩溃,整个程序都无法使用,为什么会整个程序都无法使用呢?是不是必须要多线程才能解决此问题(就是一个业务方法出问题,而不影响其它业务的使用)?不好意思,问的有点多了。
  • 打赏
  • 举报
回复
其实这就跟我举的卖火车票的例子类似,我们可以微微修改业务流程,我们可以把火车票从待售车票的表中转移到正在销售的表中,然后假设5分钟还没有被真正销售出去我们再把它转回待售车票中继续销售。这样就不需要事务了,因为我们用数据结构的变化来代替了长时间加锁的问题。
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zhlin3415058 的回复:]
我是做HIS系统的,就是在结算申请和结算的时候,那里的业务操作比较多,大概操作10多张表,但我有点不太理解,因为我的业务都是先运算完毕后,最后把数据库操作集合在一起作事务控制,这样按道理应该不会超时的,单机测试重未出现过超时现象,但系统正式运行后,偶发性的就出现超市现象了。[/Quote]

不知道为何“按道理应该不会超时”。只要是在一个事务中涉及读写很多记录(特别是SQL Server是及其“悲观的”或者说“严谨的”Read Committed级别),那么如果这些记录也被大量业务使用,就会影响事务完成时间。

我不知道你的“一起做事务控制”具体是什么内容。但是可能:事务中有些部分其实没有必要那么高的实时性,例如一个交易付款时我们可以仅仅处理必须立刻处理的记录,而将转账和汇总等等放到过一会儿,甚至夜间才执行。等等。
wsdydmw 2010-10-31
  • 打赏
  • 举报
回复
来看看 学习鸟。。。
wuyq11 2010-10-31
  • 打赏
  • 举报
回复
using(TransactionScope scope = new TransactionScope()) { //方法1 //方法2: scope.Complete(); }
zhlin3415058 2010-10-31
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sp1234 的回复:]
你没有具体的业务说明,不知道它是什么。所以很难说清楚。
[/Quote]

我是做HIS系统的,就是在结算申请和结算的时候,那里的业务操作比较多,大概操作10多张表,但我有点不太理解,因为我的业务都是先运算完毕后,最后把数据库操作集合在一起作事务控制,这样按道理应该不会超时的,单机测试重未出现过超时现象,但系统正式运行后,偶发性的就出现超市现象了。
  • 打赏
  • 举报
回复
你没有具体的业务说明,不知道它是什么。所以很难说清楚。
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhlin3415058 的回复:]
谢谢楼上给出的这么多建议和意见,我还是有一个问题,为什么我的系统服务业务一个地方出现问题时,会导致整个系统都崩溃,根据我记录的日志来看,还是某个业务事务超时引起,当我重启服务业务程序后,一切又可以正常运行了。[/Quote]

不用管它是什么业务,只要简单地“重写”,并且尽可能拆开不要在一个事务中去完成。如果需要,微调你的业务操作流程,来制造拆散这个事务的条件。

拆散它,不用问它为什么危害系统,反正它已经拖垮了系统了。

实际上当你拆散之后,系统稳定一段时间之后,可以再次考虑再次重构它,可以再把一些需要合并的重新合并回来。
zhlin3415058 2010-10-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sp1234 的回复:]
另外,“我主要想测试事务过期时间问题”只要并发地执行大量的比较耗时的事务就可以了。比如模拟500个用户同时查询火车票并且分别购买1张或者多张票的工作,每一个测试实例分别占一个线程,让它们同时操作,然后看看你的系统是否变慢。

不需要什么“让程序停止一段时间(停止时间内可执行其它操作),然后再提交事务”。
[/Quote]

谢谢楼上给出的这么多建议和意见,我还是有一个问题,为什么我的系统服务业务一个地方出现问题时,会导致整个系统都崩溃,根据我记录的日志来看,还是某个业务事务超时引起,当我重启服务业务程序后,一切又可以正常运行了。
  • 打赏
  • 举报
回复
另外,“我主要想测试事务过期时间问题”只要并发地执行大量的比较耗时的事务就可以了。比如模拟500个用户同时查询火车票并且分别购买1张或者多张票的工作,每一个测试实例分别占一个线程,让它们同时操作,然后看看你的系统是否变慢。

不需要什么“让程序停止一段时间(停止时间内可执行其它操作),然后再提交事务”。
  • 打赏
  • 举报
回复
不要去随意修改事务超时时间。否则你虽然蒙了自己一时,会给整个系统其它事务造成更加严重的延时。
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhlin3415058 的回复:]
引用 2 楼 phil999 的回复:
我就是想测试我现在的事务时间是不是短了,现在遇到的情况是这样,有一个事务函数,里面对数据库表的操作较多, 单机测试重来没出现过事务超时的情况,但网络很多终端同时操作时,偶尔会出现超市,更严重是,事务出现……
[/Quote]

这不存在短不短的问题。在压力测试下发现事务超时而失败,那么要看你的事务是不是做了过多的根本不该在一个事务中设计的事以至于互相封锁。基本上,任何事务都应该在1、2秒钟内完成,并且尽可能做最简单的事。不要滥用事务。没有必要放在一个事务中的,就不要放在事务中。

例如联网购买火车票,当一个顾客选中一个票之后,再录入交易基本信息(例如会员号和送票时间送票地点等),这段时间就绝对不能加锁。防止其它人购买此票,绝对不能用低级的数据库事务来解决,这就根本不是数据库事务该做的事。
int64 2010-10-31
  • 打赏
  • 举报
回复
加个Timer呢
jointan 2010-10-31
  • 打赏
  • 举报
回复
public void Delay(int sec)
{
for(;;)
{
DateTime s=DateTime.Now:
if((DateTime.Now - s).TotalSecond>sec)
return;
Application.DoEvents();
}
}
zhlin3415058 2010-10-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 phil999 的回复:]
如果是数据库操作,可以设置连接的超时时间,设短点,线程多休眠一会

进程是静态的,没有休眠的概念,线程才能休眠
[/Quote]

对,是线程,我说错了。

我就是想测试我现在的事务时间是不是短了,现在遇到的情况是这样,有一个事务函数,里面对数据库表的操作较多, 单机测试重来没出现过事务超时的情况,但网络很多终端同时操作时,偶尔会出现超市,更严重是,事务出现超市,导致整个系统崩溃,我实在不知道为什么,求赐教,感激不尽
zhlin3415058 2010-10-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyq11 的回复:]
延迟操作
System.Threading.Timer t = new System.Threading.Timer(new TimerCallback(method));
t.Change(1000, 1000);
private void method(object state)
{}
[/Quote]

请问这种写法只能延迟method 这个么?

我是想这样延迟:
private void Test()
{
事务 open ();

//延迟一定时间,最好能自定义

事务 commit();


}
  • 打赏
  • 举报
回复
楼上高手!
加载更多回复(2)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧