Geralmente, não é o servidor de banco de dados que está vulnerável a erros quando ocorre um salto instantâneo: são os aplicativos que usam o tempo que está.
Geralmente, existem duas maneiras de rastrear o tempo: rastrear o próprio tempo ou comparar o horário do sistema. Ambos têm algumas trocas positivas e negativas.
Rastreamento de tempo próprio
Vejo isso usado em alguns programas e sistemas embarcados em que o tempo exato não é tão crítico. Em um loop principal do aplicativo, é tratada uma maneira de rastrear um 'tick'. Este poderia ser um alarme dado pelo kernel, sleep ou select que fornece uma indicação da quantidade de tempo passado. Quando você sabe que horas são passadas, sabe que pode adicionar ou subtrair essa hora a um contador. Esse contador é o que faz o seu aplicativo de temporização acontecer. Por exemplo, se o contador for superior a 10 segundos, você poderá descartar algo ou precisará fazer algo.
Se o aplicativo não acompanhar o tempo, o contador não será alterado. Isso pode ser desejado, dependendo do design do seu aplicativo. Por exemplo, controlar quanto tempo um processo de longa execução leva para que algo seja tratado é mais fácil com um contador do que uma lista de carimbos de data / hora de início / parada.
Pró:
- Não depende do relógio do sistema
- Não vai quebrar em um grande momento skew
- Nenhuma chamada dispendiosa do sistema
- Contadores pequenos custam menos memória que um carimbo de data / hora completo
Vigarista:
- O tempo não é muito preciso
- A mudança no horário do sistema pode torná-lo ainda mais impreciso
- O tempo é relativo à execução do aplicativo, não persiste
Comparando a hora do sistema
Este é o sistema usado com mais frequência: armazene um carimbo de data e hora e compare-o com o carimbo de hora usando uma chamada de horário do sistema. Inclinações enormes no horário do sistema podem ameaçar a integridade do seu aplicativo, uma tarefa de alguns segundos pode levar horas ou terminar imediatamente, dependendo da direção do relógio.
Pró:
- Comparação precisa de tempo
- Persiste durante reinicializações e interrupções prolongadas
Vigarista:
- Faz uma chamada do sistema para obter um novo registro de data e hora para comparar com outros registros de data e hora
- O aplicativo precisa estar ciente de inclinações ou pode quebrar
Sistemas afetados
A maioria dos aplicativos utilizará o registro de data e hora para agendar tarefas. Para sistemas de banco de dados que podem ser limpezas de cache.
Todos os aplicativos que usam um banco de dados e funções de tempo de chamada no idioma da consulta serão afetados por distorções se o aplicativo não detectar e manipular adequadamente. Os aplicativos nunca poderiam parar de executar ou permitir períodos de login indefinidos, dependendo de sua finalidade.
Os sistemas de correio usarão carimbos de data e hora e / ou tempos limite para lidar com e-mails obsoletos ou não entregues. Uma inclinação do relógio pode afetar isso, mas com um impacto muito menor. Os temporizadores de retirada relativos à reconexão com os servidores podem ser perdidos, resultando em penalidades no servidor de conexão.
Eu não acho (não pesquisei) que os alarmes do kernel dispararão ao alterar a hora do sistema. Os sistemas que os utilizam podem ser seguros.
Soluções
Mova suavemente o tempo. Isso pode ser encontrado na documentação da sua solução de tempo favorita.
now()
. Você pode adicionar algum método seguro para alterar o horário da sua resposta?