- PR -

ユニークキー生成

投稿者投稿内容
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2005-05-11 14:49
引用:

がるがるさんの書き込み (2005-05-11 13:46) より:
# マイクロ秒単位で処理がそろうこと自体が相当マレですし


本題とずれますが、「マイクロ病を取得する方法」に注意しないと、こういう値ってしばらくの期間は同じ値が返ったりすることが多いような気がします。
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-05-11 17:43
どもでし。がると申します。

To SE卵さん
引用:

だけどこれって、もし別のマシンから同時にレコードが追加さ
れた場合って大丈夫なんですかね?念のため、トランザクション
かけた方がよさそうですね。


んっと。単純なinsertは、むしろトランザクションをかけないほうが
安全です :-P
もし「めっさ混雑してたり大量のデータだったりでちょっと怖い」場合、手法としては
コード:
do {
  ret = 単純なinsertで「keyを確保する」
} while(false == ret)

begin tran
  確保できてから、改めてupdateで「落ち着いてデータを格納する」
commit


こんな方法がよいです。
これだと、最悪ごみが残りますが、それは後で片付ければよいだけなので。


to なちゃさん
引用:

本題とずれますが、「マイクロ病を取得する方法」に注意しないと、こういう値ってしばらくの期間は同じ値が返ったりすることが多いような気がします。


をを。ちょっと興味のある情報でし。
私はもっぱらLinuxベースなので…というのはあるのですが。
gettimeofday(2)をよく使っているのですが、私がLinux上で使っている限りでは、
なちゃさんのおっしゃるような「しばらくの期間は同じ値が…」という状況は
ないように思われます。
# 数百プロセス上でそれぞれ数千threadをぶん回してチェックしたことが :-P

ただ…Windows OSだとどうなんでしょう?
識者のかた、コメントなどいただけるとありがたいです。
SE卵
大ベテラン
会議室デビュー日: 2004/10/22
投稿数: 135
投稿日時: 2005-05-11 17:47
きくちゃんさん、なちゃさん返信遅くなって申し訳ないです。

> お手元に SQL Server Books Online はありませんか?

SCOPE_IDENTITY の所に、

現在のセッション内の任意のテーブルで生成された最後の ID 値を返します。ただし、
SCOPE_IDENTITY が返す値は、現在の有効範囲の中で挿入された値に限られます。
@@IDENTITY の場合は、特定の有効範囲に限定されません。

と書いてありますね。とういことは、1セッションごとかつ有効範囲ごとに返ってくる
値は違う訳ですね。1セッションごとってブラウザごとって考えても良いですよね?

何か解釈が間違っていたりするかも。。。
SE卵
大ベテラン
会議室デビュー日: 2004/10/22
投稿数: 135
投稿日時: 2005-05-11 17:53
がるがるさん、返信ありがとうございます。

> 単純なinsertは、むしろトランザクションをかけないほうが安全です。

やっぱりそうですよね。ただ、同時に書き込みされた時にSCOPE_IDENTITY
で取得した値に矛盾が生じないか不安に思ったので、、、ヘルプみて少し
は安心しました。私の解釈が間違っていないのであれば

あと、サンプル的なご提案ありがとうございます。勉強になります。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-05-11 18:10
> 1セッションごとってブラウザごとって考えても良いですよね?

ブラウザのセッション?
ASP.NETのセッション?

SQLServerのセッションとは別物だと思います。
# といいながらもSQLServerのセッションや有効期限は分かっていないのですが。
SE卵
大ベテラン
会議室デビュー日: 2004/10/22
投稿数: 135
投稿日時: 2005-05-11 18:30
todoさん、返信ありがとうございます。


> SQLServerのセッションとは別物だと思います。

ですよね。 そんな甘くないか。。。

しかし、なぜ同時にレコードが書き込まれても大丈夫なのか
という裏付けをどうしても取りたいと思います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-05-11 19:36
シーケンス作ってます

先にシーケンスに問い合わせてからInsert
_________________
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-05-11 22:33
SE卵さん、こんばんは。

引用:

1セッションごとってブラウザごとって考えても良いですよね?


ADO.NET の場合、開いている Connection オブジェクト = セッション と考えて良かったと思います。
つまり、.Open() 〜 .Close() の間が 1 セッションだったはずで、変にインスタンスを共有とかしてない限り問題ないと思います。

#と言いつつも、一応、実証実験とかやって裏は取って下さいね。

スキルアップ/キャリアアップ(JOB@IT)