У меня есть служба 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 секунд для итерации? Я понимаю, что каждый таймер будет работать в отдельном потоке, но, учитывая, что новое соединение с базой данных устанавливается каждый раз, увидит ли второй вызов изменения, внесенные первым?