Windows服务数据库更新

时间:2010-11-01 09:25:05

标签: c# oracle .net-3.5 windows-services

我有一个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秒迭代,会发生什么?我意识到每个计时器都可以在一个单独的线程中工作,但是每次建立一个新的数据库连接时,第二个调用是否会看到第一个调用所做的更改?

2 个答案:

答案 0 :(得分:1)

第二个进程只会看到第一个进程所做的更改。如果第二个进程在第一个提交之前开始,那么它将看不到第一个进程所做的更改。

假设是在您的流程中执行一次提交。如果您在每次更新后执行提交,则所有投注均已关闭。您的第二个进程将看到第一个进程执行的一些更新,但不是全部 - 仅在第二个进程中打开游标时提交的更新。

答案 1 :(得分:0)

如果你吓到光标需要超过20秒,你可以在进程之前停止计时器,然后在进程完成后重新启动计时器。你有可能在处理之前停止计时器吗?