Как я могу программно установить точку отката для транзакции весной?

Как я могу указать точку отката для транзакции в Spring?

Предполагая следующий сценарий, мне нужно выполнить очень длинную вставку в базу данных, которая занимает довольно много времени (несколько минут). Эта операция вставки заключена в транзакцию, которая гарантирует, что в случае возникновения проблемы транзакция будет прервана, а база данных восстановлена ​​до состояния, предшествующего началу транзакции.

Однако это решение влияет на производительность приложения, поскольку другие транзакции не могут получить доступ к базе данных, пока выполняется длинная транзакция. Я решил эту проблему, разделив большую транзакцию на несколько меньших транзакций, выполняющих одну и ту же операцию. Однако, если одна из этих небольших транзакций завершается неудачей, база данных возвращается к состоянию, предшествующему этой последней транзакции. К сожалению, это оставило бы базу данных в неправильном состоянии. Я хочу, чтобы при возникновении ошибок в какой-либо из этих небольших транзакций база данных откатывалась к состоянию, предшествующему первой небольшой транзакции (т. е. к точно такому же состоянию, она будет откатываться, если эта операция выполняется отдельной транзакцией).

Есть ли у вас какие-либо предложения, как я могу добиться этого с помощью транзакций Spring?


person Giuseppe Pes    schedule 03.04.2014    source источник
comment
Промежуточные таблицы могут помочь вам в этом.   -  person Dan Bracuk    schedule 03.04.2014
comment
Да, это еще одно решение. Аналогичная проблема возникает при перемещении данных из промежуточных таблиц в рабочие таблицы, если данные в промежуточных таблицах достаточно велики.   -  person Giuseppe Pes    schedule 03.04.2014
comment
Запланировать это, когда дела не заняты, может быть вариантом.   -  person Dan Bracuk    schedule 03.04.2014
comment
Да, это вариант. К сожалению, я не контролирую, когда эта операция запускается. Его запускает администратор, я могу только порекомендовать запускать его, когда сервер не слишком загружен.   -  person Giuseppe Pes    schedule 03.04.2014
comment
Я не уверен, что Spring (или любой другой фреймворк в этом отношении) поможет вам здесь. На самом деле речь идет о том, как вы можете изменить свой код, чтобы продолжительность транзакции была как можно короче. Временная таблица может быть вариантом. Рефакторинг кода может быть другим.   -  person Stephane Nicoll    schedule 03.04.2014
comment
Что сказал администратор, когда вы сказали, что выполнение этого задания по расписанию уменьшит его рабочую нагрузку?   -  person Dan Bracuk    schedule 03.04.2014


Ответы (2)


Вам следует обратиться к http://docs.spring.io/spring/docs/4.0.3.RELEASE/javadoc-api/org/springframework/transaction/TransactionStatus.html . Имеет требуемый функционал: - создать точку сохранения - освободить точку сохранения - откатиться на точку сохранения

Конечно, ваш менеджер транзакций (а также базовый драйвер JDBC и БД) должен поддерживать эту функциональность.

person Eugene    schedule 03.04.2014

если вы можете использовать одну и ту же последовательность первичных ключей для промежуточных и производственных таблиц, вы должны пакетно перемещать данные из stg в prod. когда небольшая транзакция терпит неудачу, вы можете использовать ключи в промежуточной таблице для удаления из рабочей таблицы. таким образом вы можете восстановить производственную таблицу в исходное состояние

person M.Faizal    schedule 04.04.2014