Es ist normalerweise nicht der Datenbankserver, der für Fehler anfällig ist, wenn ein sofortiger Zeitsprung auftritt: Es sind die Anwendungen, die die aktuelle Zeit verwenden.
Es gibt im Allgemeinen zwei Möglichkeiten, die Zeit zu verfolgen: die eigene Zeit zu verfolgen oder die Systemzeit zu vergleichen. Beide haben einige positive und negative Kompromisse.
Eigene Zeiterfassung
Ich sehe dies in einigen eingebetteten Programmen und Systemen, in denen das genaue Timing nicht so wichtig ist. In einer Hauptanwendungsschleife wird eine Möglichkeit zum Verfolgen eines "Häkchens" besorgt. Dies kann ein Alarm sein, der vom Kernel, Sleep oder Select ausgegeben wird und einen Hinweis auf die verstrichene Zeit gibt. Wenn Sie wissen, welche Zeit vergangen ist, können Sie diese Zeit zu einem Zähler addieren oder von diesem abziehen. Dieser Zähler ist es, der Ihre Zeitsteuerungsanwendung ermöglicht. Wenn der Zähler beispielsweise länger als 10 Sekunden ist, können Sie etwas verwerfen, oder Sie müssen etwas tun.
Wenn die Anwendung die Zeit nicht verfolgt, ändert sich der Zähler nicht. Dies kann abhängig vom Design Ihrer Anwendung gewünscht sein. Zum Beispiel ist es mit einem Zähler einfacher zu verfolgen, wie lange ein Prozess dauert, der etwas erledigt, als mit einer Liste von Start- / Stopp-Zeitstempeln.
Profi:
- Unabhängig von der Systemuhr
- Bricht nicht auf einem großen Zeitversatz
- Kein teurer Systemaufruf
- Kleine Zähler kosten weniger Speicher als ein vollständiger Zeitstempel
Con:
- Die Zeit ist nicht sehr genau
- Eine Änderung der Systemzeit kann die Genauigkeit noch erhöhen
- Das Timing ist relativ zum Ausführen der Anwendung, bleibt aber nicht erhalten
Systemzeit vergleichen
Dies ist das am häufigsten verwendete System: Speichern Sie einen Zeitstempel und vergleichen Sie ihn mit dem Zeitstempel mithilfe eines Systemzeitaufrufs. Große Zeitverschiebungen in der Systemzeit können die Integrität Ihrer Anwendung gefährden. Je nach Richtung der Uhr kann eine Aufgabe von wenigen Sekunden Stunden dauern oder sofort enden.
Profi:
- Genaue Zeitvergleich
- Bleibt bei Neustarts und langen Ausfällen bestehen
Con:
- Nimmt einen Systemaufruf entgegen, um einen neuen Zeitstempel zum Vergleich mit anderen Zeitstempeln abzurufen
- Die Anwendung muss auf Schräglauf achten oder kann abbrechen
Betroffene Systeme
Die meisten Anwendungen verwenden einen Zeitstempel im Vergleich zu geplanten Aufgaben. Für Datenbanksysteme, bei denen es sich um Cache-Bereinigungen handeln könnte.
Alle Anwendungen, die eine Datenbank verwenden und Zeitfunktionen in der Abfragesprache verwenden, sind von Zeitversatz betroffen, wenn sie von der Anwendung nicht erkannt und entsprechend behandelt werden. Anwendungen könnten je nach Zweck niemals aufhören zu laufen oder unbestimmte Anmeldezeiträume zulassen.
Mail-Systeme verwenden Zeitstempel und / oder Zeitüberschreitungen, um veraltete oder nicht zugestellte Mails zu verarbeiten. Ein Zeitversatz könnte das beeinflussen, aber mit einer viel geringeren Auswirkung. Back-Off-Timer für das erneute Herstellen einer Verbindung zu Servern können versäumt werden, was zu Strafen für den Server führt, der die Verbindung herstellt.
Ich glaube nicht (habe nicht recherchiert), dass Kernel-Alarme beim Ändern der Systemzeit ausgelöst werden. Systeme, die diese verwenden, könnten sicher sein.
Lösungen
Zeit sanft verschieben. Dies finden Sie in der Dokumentation Ihrer bevorzugten Zeitlösung.
now()
. Können Sie Ihrer Antwort eine sichere Methode zum Ändern der Uhrzeit hinzufügen?