[pgsql-jp: 30270] Re: SQLのMAX 関数について

Masato Tanaka pgsql @ e-linez.com
2003年 6月 30日 (月) 00:53:34 JST


田中です。

またまた、ありがたいアドバイスありがとうございます。

> この場合、「table」をテーブルロックすれば大丈夫ですよね。
> ・「TABLE」をテーブルロック
> ・Insert文発行
> ・Commit発行
> いかがでしょうか。

シーケンスは、データを入れ替えたときなど、自分の期待する値が割り当てられな
かったりという話を聞いたことがあるので、ちょっと敬遠していました。
なるほど。今回のケースだとロックする方法が良いかもしれません。

INSERT文発行前に、以下のSQLを発行することにしました。(あっているだろう
か。。。)
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

ちなみに、現在PHPLIBのDB_Sqlというクラスを使ってSQLを発行しているのですが、
自動的にトランザクションの処理(BEGIN;COMMIT;の処理)はされているのでしょう
か?
(あくまで個人的な推測ですが)

例えば、今回のような、
    INSERT INTO table VALUES(SELECT MAX(id)+1 FROM talbe);
    UPDATE table SET value='efg' WHERE id=(SELECT MAX(id) FROM table);
というSQLを発行したとき、UPDATE文の記述ミスでエラーが発生すると、
ロールバックされていましたので、そうなのかなあと思いました。
ですので、BIGIN;やCOMMIT;の文章は入れていません。

話が飛躍してわかりにくくなってしまいました。ご容赦ください。





pgsql-jp メーリングリストの案内