Я пишу систему, которая держит спящего режима управляемого объект под названием Voucher
, который имеет поле с именем serialNumber
, который содержит уникальный номер для единственного существующего действительного копию ваучера экземпляра , В таблице базы данных могут быть старые и недопустимые копии, что означает, что поле базы данных может не быть объявлено уникальным. Операция, которая сохраняет новый действительный экземпляр ваучера (который будет нуждаться в новом серийном номере), в первую очередь синхронизируется с соответствующим объектом. После этого вся процедура инкапсулируется в транзакции, то новое значение извлекается с помощью JPQLОбеспечение уникальных серийных номеров в сеансе Hibernate
SELECT MAX(serialNumber) + 1 FROM Voucher
поле получает результат из запроса, экземпляр после этого сохраняется, сеанс сбрасывается, транзакция совершается и код, наконец, покидает синхронизированный блок.
Несмотря на все это, база данных иногда (если редко) заканчивается ваучерами с повторяющимися серийными номерами.
Мой вопрос: учитывая, что я довольно уверен в синхронизации и обработке транзакций, есть ли что-то более или менее очевидное, что я должен знать о спящем режиме, который я пропустил, или мне нужно вернуться к еще одному сеансу отладки, пытаясь найти что-нибудь еще, что вызвало проблему?
Служба, выполняющая процесс сохранения, представляет собой веб-приложение, работающее на tomcat6, и управляется Spring HttpRequestHandlerServlet
. Соединения db объединяются с помощью C3P0, при этом выполняется очень большая настройка по умолчанию.
Я ценю любое предложение,
Благодарности
Какие СУБД вы используете? –
Обычный старый MySQL – TompaBompa