Сохраняется ли состояние sequence при rollback
Что проверяют
Понимаете ли вы, что генератор последовательностей живёт вне транзакции, и что из этого следует для идентификаторов. В Java-собеседовании вопрос почти всегда продолжается в сторону JPA и стратегий генерации ключа.
Как отвечать
Нет, откат не возвращает последовательность назад. Получение следующего значения не подчиняется транзакционной семантике: значение считается выданным навсегда. Иначе два параллельных сеанса, работающих одновременно, получали бы одинаковый идентификатор, и вся идея уникальности рассыпалась бы. Поэтому после отката, аварийного завершения или перезапуска сервера в нумерации остаются дыры. Так ведут себя последовательности в PostgreSQL и Oracle, и автоинкремент в MySQL.
Дальше переводите на Java. При GenerationType.SEQUENCE Hibernate обычно работает через пул: у генератора есть allocationSize со значением по умолчанию пятьдесят, он забирает из последовательности одно число и раздаёт целый диапазон в памяти. Значит дыры станут только шире, а при перезапуске приложения остаток пула теряется. Отсюда важное условие: allocationSize обязан совпадать с шагом самой последовательности в базе, иначе приложение начнёт выдавать уже занятые идентификаторы.
Вывод, который стоит произнести вслух: идентификатор это техническая уникальность, а не счётчик. Непрерывная нумерация документов делается отдельным механизмом, и цена ей сериализация вставок.
Где спотыкаются
Обещают, что откат вернёт счётчик, и по дороге путают откат с точкой сохранения. Точка сохранения откатывает часть изменений транзакции, но на выданные значения последовательности не влияет так же, как полный откат.
Требуют непрерывную нумерацию от последовательности и начинают лечить дыры ручным сдвигом счётчика. На живой системе это надёжный способ получить нарушение уникальности при следующей же вставке.
Не различают стратегии генерации. С IDENTITY Hibernate не может складывать вставки в пакет, потому что идентификатор известен только после самой вставки, и производительность массовой загрузки падает без видимой причины.