- - PR -
ユニークキー生成
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-05-11 14:49
本題とずれますが、「マイクロ病を取得する方法」に注意しないと、こういう値ってしばらくの期間は同じ値が返ったりすることが多いような気がします。 | ||||||||||||
|
投稿日時: 2005-05-11 17:43
どもでし。がると申します。
To SE卵さん
んっと。単純なinsertは、むしろトランザクションをかけないほうが 安全です :-P もし「めっさ混雑してたり大量のデータだったりでちょっと怖い」場合、手法としては
こんな方法がよいです。 これだと、最悪ごみが残りますが、それは後で片付ければよいだけなので。 to なちゃさん
をを。ちょっと興味のある情報でし。 私はもっぱらLinuxベースなので…というのはあるのですが。 gettimeofday(2)をよく使っているのですが、私がLinux上で使っている限りでは、 なちゃさんのおっしゃるような「しばらくの期間は同じ値が…」という状況は ないように思われます。 # 数百プロセス上でそれぞれ数千threadをぶん回してチェックしたことが :-P ただ…Windows OSだとどうなんでしょう? 識者のかた、コメントなどいただけるとありがたいです。 | ||||||||||||
|
投稿日時: 2005-05-11 17:47
きくちゃんさん、なちゃさん返信遅くなって申し訳ないです。
> お手元に SQL Server Books Online はありませんか? SCOPE_IDENTITY の所に、 現在のセッション内の任意のテーブルで生成された最後の ID 値を返します。ただし、 SCOPE_IDENTITY が返す値は、現在の有効範囲の中で挿入された値に限られます。 @@IDENTITY の場合は、特定の有効範囲に限定されません。 と書いてありますね。とういことは、1セッションごとかつ有効範囲ごとに返ってくる 値は違う訳ですね。1セッションごとってブラウザごとって考えても良いですよね? 何か解釈が間違っていたりするかも。。。 | ||||||||||||
|
投稿日時: 2005-05-11 17:53
がるがるさん、返信ありがとうございます。
> 単純なinsertは、むしろトランザクションをかけないほうが安全です。 やっぱりそうですよね。ただ、同時に書き込みされた時にSCOPE_IDENTITY で取得した値に矛盾が生じないか不安に思ったので、、、ヘルプみて少し は安心しました。私の解釈が間違っていないのであれば あと、サンプル的なご提案ありがとうございます。勉強になります。 | ||||||||||||
|
投稿日時: 2005-05-11 18:10
> 1セッションごとってブラウザごとって考えても良いですよね?
ブラウザのセッション? ASP.NETのセッション? SQLServerのセッションとは別物だと思います。 # といいながらもSQLServerのセッションや有効期限は分かっていないのですが。 | ||||||||||||
|
投稿日時: 2005-05-11 18:30
todoさん、返信ありがとうございます。
> SQLServerのセッションとは別物だと思います。 ですよね。 そんな甘くないか。。。 しかし、なぜ同時にレコードが書き込まれても大丈夫なのか という裏付けをどうしても取りたいと思います。 | ||||||||||||
|
投稿日時: 2005-05-11 19:36
シーケンス作ってます
先にシーケンスに問い合わせてからInsert _________________ | ||||||||||||
|
投稿日時: 2005-05-11 22:33
SE卵さん、こんばんは。
ADO.NET の場合、開いている Connection オブジェクト = セッション と考えて良かったと思います。 つまり、.Open() 〜 .Close() の間が 1 セッションだったはずで、変にインスタンスを共有とかしてない限り問題ないと思います。 #と言いつつも、一応、実証実験とかやって裏は取って下さいね。 |