我总是遇到矛盾错误
引起原因:java.sql.BatchUpdateException:ORA-00001:违反了唯一约束
每当我尝试调用同步方法时,该方法会在由HBM生成主键的表中插入一个值:
<id name="logId" type="java.lang.Long">
<column name="LOG_ID" precision="20" scale="0" />
<generator class="sequence">
<param name="sequence">TRANS_LOG_ID</param>
<param name="allocationSize">100</param>
</generator>
</id>
这是线程调用的方法:
public synchronized static void saveTransLog(String detail, String stage) {
TransLog transLog = new TransLog();
transLog.setDetail(detail);
transLog.setStage(stage);
...
TransLogService.save(transLog);
}
我想知道对于这些多线程方案是否有更可靠的锁处理。还是我需要添加一些东西来解决我的约束违例问题。
非常感谢你。
最佳答案
可能是该序列的当前值与您的行的主键冲突。您可以使用以下查询来验证这一点。
SELECT trans_log_id.curr_val FROM dual;
然后将此数字与列
LOG_ID
的最大值进行比较。这两个值应相等或序列的当前值应更大。如果序列的当前值较小,请使用语句
trans_log_id.next_val
递增序列的值。