2017-04-05 6 views
1

私はフィールドが自動タイムスタンプフィールド(SET DEFAULT CURRENT_TIMESTAMP)であるPostgreSQLテーブルを持っています。フィールドはマイクロ秒の精度です。同じタイムスタンプを持つ行を持つことは可能ですか?またはPostgreSQLの同時実行制御によってオブジェクトの更新にシリアル順序が適用されますか?SQL Automaticタイムスタンプでの衝突は可能ですか?

+1

https://www.postgresql.org/docs/9.6/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT:current_timestampはトランザクションの開始に関連付けられているため、挿入または更新される複数の行同じトランザクションは同じタイムスタンプを持ちます。 – wildplasser

答えて

2

はい。 clock_timestamp()を使用して毎回新しいタイムスタンプを取得しても、マイクロ秒タイマーの精度を持つシステムであっても、衝突が発生する可能性があります。

マイクロ秒タイマー精度は、精度またはの解像度を意味しません。時計は「飛び降りる」。いくつかのシステムでは、これらのジャンプはサブマイクロ秒(μs)で、PostgreSQLのようなマイクロ秒タイマーの解像度で動作するアプリケーションには見えません。しかし、いくつかのシステムでは数十ミリ秒か数百ミリ秒になることがあります。

Windows 8およびServer 2012で導入されたGetSystemTimePreciseAsFileTime(およびPostgreSQL 9.5の採用)以前のMS Windowsでは、時間は1ミリ秒(ms)の解像度に制限され、通常は15msの解像度でした。だから極端には、ほとんどアイドル以外のシステム上の複数の呼び出しに対して同じ時間値を取得する可能性が高いです。

最近のLinux、または最近のPostgreSQLを搭載した現代的なWindowsでは、ミリ秒未満のタイマー解決による衝突の可能性は非常に低くなります。しかし、彼らは間違いなく可能です。一意のキーとしてタイムスタンプを使用することを選択した場合、アプリは一意の違反を取得した場合に再試行できなければなりません。

1

可能です。

約5,000万エントリのPostgreSQLテーブルを見ると、自動タイムスタンプフィールドに同じタイムスタンプを持つエントリが約70セットあります。