ユーザーが同時にデータを変更できる Web アプリケーションがあります。現時点では、各フォームに古い行の値を含め、データが同じ場合にのみ行を更新しています。SQLite では、これが唯一のオプションです。これは醜いので、これを行うためのより良い方法が提供される場合は、別の SQL データベースに切り替えることを検討しています。PostgreSQL または MySQL には、代わりに使用できる暗黙的な行のタイムスタンプまたはバージョン番号がありますか?
3 に答える
数値カウンターを使用する方が、タイムスタンプを使用するよりも優れています。タイムスタンプが正確であっても、データの 2 つのバージョンが同時にコミットされ、同じタイムスタンプが取得される可能性があります。数値カウンター (例: update mytable set counter=counter+1, data=? where id=? and counter=?
) を使用すると、行が変更されるたびに一意のカウンター値が取得されます。(where 句で元のカウンター値を指定します。データが他のユーザーによって変更されている場合、一致する行はありません。)
これは「暗黙の」解決策ではありませんが、問題ないと思います。Hibernate などのライブラリには、この種のことを自動的に実行できる機能があるため、コードで心配する必要はありません。
MySQL には、および制約と組み合わせると、この目的に使用できるTIMESTAMP
データ型があります。DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
PostgreSQL では、呼び出されるすべてのテーブルに「隠しフィールド」がありxmin
、行のバージョンを特定するために使用できます。
私の知る限り、Postgres で更新タイムスタンプを取得するにはトリガーが必要です。この非常によく似た質問を参照してください。
PostgreSQL で行が更新されたときにタイムスタンプを更新する
その質問 (および Eric の回答) は、MySQL がこの w/oa トリガーをサポートしていることを指摘しています。