Обновление базы данных службы Windows - PullRequest
1 голос
/ 01 ноября 2010

У меня есть служба 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 ]

1 голос
/ 01 ноября 2010

Второй процесс будет видеть только изменения, совершенные первым.Если второй процесс запускается до первой фиксации, он не увидит изменений, внесенных первой.

Предполагается, что в вашем процессе выполняется одна фиксация.Если вы выполняете коммит после каждого обновления, тогда все ставки отключены.Ваш второй процесс увидит некоторые обновления, выполненные первым, но не все - только те, которые были зафиксированы, когда курсор открыт во втором процессе.

0 голосов
/ 01 ноября 2010

Если вы боитесь, что курсор занимает более 20 секунд, вы можете остановить таймер до процессов, а затем перезапустить таймер после завершения процесса. Возможно ли остановить таймер перед началом процесса?

...