我在C#中有一个服务,它从oracle DB中提取记录并插入到MySql DB中,在成功插入MySql DB中的所有记录后,我的Oracle DB中的一列得到了更新,即这些记录已被插入。
因为它是一项服务,每隔5秒就会被调用一次。
我的问题是,在这种情况下,我应该如何处理死锁情况。例如,我的服务从oracle DB中获取大约20,000条记录,并尝试插入到Oracle中,这需要大约7-8秒的时间,也就是说,当我的服务将被调用时,由于上一次会话的所有记录都不会被插入,所以在MySql DB中不会有更新,下一次它将再次获取整个记录,这是我不想要的。
如果可能,也提供一些相同的代码。这是纯基于窗口的服务,而不是WCF。
发布于 2012-08-21 20:50:38
如果您只在此服务中需要“协调”,则使用AutoResetEvent类。
{} finally{}构造对于此调用通常是可以的。在服务启动期间,为创建的实例调用AutoResetEvent.Set()以允许方法(由计时器调用)开始工作。
使用具有小超时的WaitOne(TimeSpan超时)允许在前一个定时器还未结束时快速完成定时器“调用”。所以你仍然可以每隔5秒调用你的方法。
当然,在调用它的方法之前,需要检查AutoResetEvent处理,也许还需要一些额外的检查……
发布于 2012-08-21 20:06:47
我不知道您的功能需求是什么,但听起来您并不是真的想在服务中开始处理,直到之前的任何运行都完成之后。也就是说,您需要某种类型的系统来告知退出运行是否正在进行,然后在启动后续进程之前对此进行检查。另一种选择是将请求排队,然后将它们作为批处理进行处理,从而有效地删除重复项。
发布于 2012-08-21 20:07:10
听起来您需要等待插入到Oracle中的操作完成,因此在c#中对请求进行排队,即同步执行它们。研究如何使用Mutex对象。
https://stackoverflow.com/questions/12054367
复制相似问题