[Seasar-user:19023] [S2JDBC] TableIdGenerator での採番は分散環境でも問題ないでしょうか

Shotaro Tsubouchi [E-MAIL ADDRESS DELETED]
2009年 12月 11日 (金) 19:20:59 JST


坪内(shootaroo)です。

ID の採番に TableIdGenerator を使用していますが、
同一インスタンス上では、IdContext.getNextValue() が synchronized なので、
問題ないと思いますが、
分散環境で同時に複数のサーバから採番が行われた際、ID が重複する可能性はないでしょうか?

発行される SQL は以下の 2 つですが、
update ID_GENERATOR set VALUE = VALUE + ? where PK = ?
select VALUE from ID_GENERATOR where PK = ?

同時でなければ、当然ながらそれぞれ別の VALUE が取れますが、
Server1: update ID_GENERATOR set VALUE = VALUE + 50 where PK = 1
Server1: select VALUE from ID_GENERATOR where PK = 1   // VALUE = 50
Server2: update ID_GENERATOR set VALUE = VALUE + 50 where PK = 1
Server2: select VALUE from ID_GENERATOR where PK = 1   // VALUE = 100

同時だと、同じ値が取れてしまうと思います。
Server1: update ID_GENERATOR set VALUE = VALUE + 50 where PK = 1
Server2: update ID_GENERATOR set VALUE = VALUE + 50 where PK = 1
Server1: select VALUE from ID_GENERATOR where PK = 1   // VALUE = 100
Server2: select VALUE from ID_GENERATOR where PK = 1   // VALUE = 100


FOR UPDATE しないとならないように思いますが、どうでしょうか。
よろしくお願いします。


Seasar-user メーリングリストの案内