[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 メーリングリストの案内