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