我知道应该使用数据库序列来获取表中下一个键的值(让我们假设一个单列数字主键),但是如果不使用序列,你是否看到任何明显的代码气味以下代码(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(插入行的位置)将对相同的数据进行操作。