我有一个Windows服务,它以给定的时间间隔轮询Oracle数据库,并根据某些条件更新多个字段。为此,它打开一个游标并遍历行进行更新。
protected override void OnStart(string[] args)
{
TimerCallback timerDelegate = new TimerCallback(DoStuff);
serviceTimer = new Timer(timerDelegate, null, 0, 20000);
}
private void DoStuff(object state)
{
// Set-up connectionsString and sqlQuery
using (OracleConnection oraConnect = new OracleConnection(connectionString))
{
oraConnect.Open();
using (OracleCommand oraCommand = new OracleCommand(sqlQuery, oraConnect))
using (OracleDataReader oraReader = oraCommand.ExecuteReader())
{
while (oraReader.Read())
{
// Do some processing here – may take some time
// Update database here
}
}
}
我的问题是,例如,计时器间隔是20秒(如上所述)。如果光标需要30秒迭代,会发生什么?我意识到每个计时器都可以在一个单独的线程中工作,但是每次建立一个新的数据库连接时,第二个调用是否会看到第一个调用所做的更改?
答案 0 :(得分:1)
第二个进程只会看到第一个进程所做的更改。如果第二个进程在第一个提交之前开始,那么它将看不到第一个进程所做的更改。
假设是在您的流程中执行一次提交。如果您在每次更新后执行提交,则所有投注均已关闭。您的第二个进程将看到第一个进程执行的一些更新,但不是全部 - 仅在第二个进程中打开游标时提交的更新。
答案 1 :(得分:0)
如果你吓到光标需要超过20秒,你可以在进程之前停止计时器,然后在进程完成后重新启动计时器。你有可能在处理之前停止计时器吗?