C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: postgresql のトリガーで自動採番


(過去ログ 118 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■69121 / inTopicNo.1)  postgresql のトリガーで自動採番
  
□投稿者/ 焦げ太 (1回)-(2013/12/05(Thu) 11:59:55)

分類:[データベース全般] 

こんにちは。

DBのpostgresql 9.x について教えて下さい。

行単位トリガーのBEFORE INSERTでユニークな番号を自動採番
「max(xxx) + 1」したいと考えています。

同時実行を考えた場合、
BEFORE INSERTのトリガーと、実際にINSERTが実行される間に
処理が割り込まれることはあるのでしょうか?
下記のイメージです。

(1)ユーザAがINSERT Aを発行する
(2)ユーザBがINSERT Bを発行する
(3)INSERT AのBEFORE INSERTが実行される
(4)INSERT BのBEFORE INSERTが実行される <--割り込み
(5)INSERT AのINSERTが実行される
(6)INSERT BのINSERTが実行される

あるとした場合、自動採番した番号が重複する可能性があるため
ロックをかける必要があると考えます。

トリガー内で行ロック(SELECT 〜 FOR UPDATE)を掛けた場合、
INSERTを発行する側で明示的なコミットが必要となるのでしょうか?

実際は「年月日+連番」の形式で年月日ごとに 1 から採番する予定です。
現在 postgresql が稼動している環境はありません。
机上で学習(?)の状態です。

よろしくお願いします。
引用返信 編集キー/
■69123 / inTopicNo.2)  Re[1]: postgresql のトリガーで自動採番
□投稿者/ オショウ (103回)-(2013/12/05(Thu) 12:48:02)
> 行単位トリガーのBEFORE INSERTでユニークな番号を自動採番
> 「max(xxx) + 1」したいと考えています。

  自動採番される列を作るのではダメなんですか?

以上。
引用返信 編集キー/
■69125 / inTopicNo.3)  Re[2]: postgresql のトリガーで自動採番
□投稿者/ 焦げ太 (2回)-(2013/12/05(Thu) 13:52:56)
オショウ様、ご回答ありがとうございます。

「自動採番される列」とはserial型のことでしょうか。

CREATE TABLE test (
id serial PRIMARY KEY
);

実際は「年月日+連番」の形式で年月日ごとに 1 から採番したいです。
例えば、2013.12.5にINSERTした場合は 131205001 からスタートし
2013.12.6にINSERTした場合は 131206001 からスタートしたいです。

serial型を使用した場合、どのように対応できるか思いついきません。
教えていただけると助かります。

また、「自動採番される列」が別の方法のことであれば、キーワード的な
ことでも構いませんので教えていただけると助かります。

よろしくお願いします。
引用返信 編集キー/
■69148 / inTopicNo.4)  Re[3]: postgresql のトリガーで自動採番
□投稿者/ オショウ (104回)-(2013/12/06(Fri) 10:44:57)
> 実際は「年月日+連番」の形式で年月日ごとに 1 から採番したいです。

  では、トリガしか無いでしょう。
  自動採番ではなく、手動採番ね・・・

  重複の可能性はあると思いますが、そこまで負荷が発生するほど
  アクセスが多いことが予想されるシステムなんですか?

  では、ロックをかけるしか無いと思いますが、PostgreSQL は、
  そう扱った経験が無いので・・・

  まずは、評価試験を行ってみては?

以上。
引用返信 編集キー/
■69182 / inTopicNo.5)  Re[4]: postgresql のトリガーで自動採番
□投稿者/ 焦げ太 (3回)-(2013/12/09(Mon) 10:25:28)
No69148 (オショウ さん) に返信

オショウ様、ご回答ありがとうございます。

>   重複の可能性はあると思いますが、そこまで負荷が発生するほど
>   アクセスが多いことが予想されるシステムなんですか?
>

重複の可能性はアクセス数の多さというよりも、例え2人でも100人
でも複数からの登録を同時のタイミングで行う可能性があるかどうかだ
と私は考えております。
実際過去に3人程度の使用で重複が発生したこともありますので。
後は採番する番号の運用上の重要度もありますが…

>   では、ロックをかけるしか無いと思いますが、PostgreSQL は、
>   そう扱った経験が無いので・・・
>
>   まずは、評価試験を行ってみては?

稼動環境が整うのがいつになるか…という状況で事前にある程度把握
しておきたかったのです。

とりあえず、トリガーで行うということと、環境が整った際にロックを
検証してみるということで解決といたします。
ありがとうございました。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -