43

SQL Server でタイムスタンプ データ型に遭遇しました。

4

3 に答える 3

29

タイムスタンプの機能を説明するために、販売注文テーブルの例を見てみましょう。

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) のドキュメントには、興味深い例がいくつかあります。

于 2013-07-21T03:38:58.583 に答える