テーブルの次のキーの値を取得するためにデータベースシーケンスを使用することになっていることは知っていますが(単一列の数値主キーを想定してみましょう)、シーケンスが使用されていない場合、明らかなコードのにおいがしますか?次のコード (コードは JPA の Java ですが、パターンは実際には言語とテクノロジに依存しません):
boolean haveSucceeded = false;
int _i = 0 ;
while ((!haveSucceeded) && (_i++ < MAX_RETRIES)) {
try {
user.setId(getFacade().maxId()+1); // line A
getFacade().create(user); // line B
haveSucceeded = true;
} catch (javax.ejb.EJBTransactionRolledbackException exc) {
debug("ConstraintValidationException, "+ ( (_i<MAX_RETRIES)?"retrying":"giving up"));
}
}
同時アクセス (他のアプリケーション インスタンスからの可能性もある) による衝突の可能性を考慮して再試行が行われ、行 A (最大値が計算される場所) と行 B (行が挿入される場所) が同じデータを操作します。