SQL Server でタイムスタンプ データ型に遭遇しました。
3 に答える
タイムスタンプの機能を説明するために、販売注文テーブルの例を見てみましょう。
create table saleorder (ordernumber int, amount int, timestamp);
insert into saleorder (ordernumber, amount) values (1, 100), (2, 100), (3, 200);
select * from saleorder
タイムスタンプ列のデータに注目してください。タイムスタンプのドキュメント(SQL Server 2005) は次のように述べています: これ (タイムスタンプ) は、データベース内の相対時間を追跡し、時計に関連付けることができる実際の時間ではありません...タイムスタンプ列を持つ行が変更または挿入されるたびに、増分されたデータベース タイムスタンプ値がタイムスタンプ列に挿入されます。
データがどのように見えるか見てみましょう:
ordernumber amount timestamp
1 100 0x00000000000007D1
2 100 0x00000000000007D2
3 200 0x00000000000007D3
大丈夫。注文 1 が最初に追加され、注文 3 が最後に入力されました。注文 1 の金額を更新するとどうなりますか?
update saleorder set amount = 200 where ordernumber = 1
select * from saleorder
ああ、注文 1 のタイムスタンプが 0x7D4 (10 進数 2004) になっていることに注意してください。他の行に関連して、注文 1 が最近更新されたことがわかります。しかし、さらに重要なことは、タイムスタンプの値は、同時書き込みが発生したときに発生します。
ordernumber amount timestamp
1 200 0x00000000000007D4
2 100 0x00000000000007D2
3 200 0x00000000000007D3
たとえば、John と Mary が、たとえば .NET で開発された Web アプリケーションを使用して、注文 3 に対応する営業を行っているとします。ジョンは注文を引き出して変更を加えます。ジョンはまだデータを保存していません。Mary は同じ注文を引き出して変更します。ジョンが先にセーブ。メアリーはデータを保存しようとします。.NET アプリケーションはまず、Mary が取得したタイムスタンプがデータベースの順序 3 のタイムスタンプと同じかどうかを確認できます。
Mary がオーダー 3 で取得したタイムスタンプが異なる場合 (John がデータを保存し、タイムスタンプが自動的に変更されたため)、.NET アプリケーションは Mary に警告し、画面上のレコードを更新して最新の変更を確認するように求めることができます (または、おそらく画面上で変更します)。
タイムスタンプを行バージョンと考えてください。興味深いことに、SQL Server の最新版では、タイムスタンプ データ型と同義の rowversion データ型が使用されています。rowversion (SQL Server 2012) のドキュメントには、興味深い例がいくつかあります。