diff --git a/h2/src/main/org/h2/table/Column.java b/h2/src/main/org/h2/table/Column.java index 50bd01bf6a..b8bb57357d 100644 --- a/h2/src/main/org/h2/table/Column.java +++ b/h2/src/main/org/h2/table/Column.java @@ -447,25 +447,31 @@ private DbException getDataConversionError(Value value, DbException cause) { } private void updateSequenceIfRequired(SessionLocal session, long value) { - if (sequence.getCycle() == Sequence.Cycle.EXHAUSTED) { - return; - } - long current = sequence.getCurrentValue(); - long inc = sequence.getIncrement(); - if (inc > 0) { - if (value <= current) { + /* + * Synchronization is necessary due to possible race with concurrent + * sessions + */ + synchronized (sequence) { + if (sequence.getCycle() == Sequence.Cycle.EXHAUSTED) { return; } - } else if (value >= current) { - return; - } - try { - sequence.modify(value + inc, null, null, null, null, null, null); - } catch (DbException ex) { - if (ex.getErrorCode() == ErrorCode.SEQUENCE_ATTRIBUTES_INVALID_7) { + long current = sequence.getCurrentValue(); + long inc = sequence.getIncrement(); + if (inc > 0) { + if (value <= current) { + return; + } + } else if (value >= current) { return; } - throw ex; + try { + sequence.modify(value + inc, null, null, null, null, null, null); + } catch (DbException ex) { + if (ex.getErrorCode() == ErrorCode.SEQUENCE_ATTRIBUTES_INVALID_7) { + return; + } + throw ex; + } } sequence.flush(session); }