Структура данных/Техника Java для управления списком последовательных команд

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

Моя ситуация

  • У меня есть набор команд SQL, выполняемых из среднего уровня (Java), для вставки/обновления/удаления данных в любую из множества очень больших таблиц через соединения из связанной промежуточной таблицы.

  • У меня есть больше команд SQL, которые обновляют различные производные таблицы на основе содержимого промежуточной таблицы/фактической таблицы. Разные таблицы будут взаимодействовать с разными производными таблицами через разные запросы (как обычно). Эти команды, возможно, придется чередовать с первым набором в зависимости от варианта использования, поэтому я не могу обязательно выполнить набор 1, а затем набор 2 одновременно.

Мой вопрос

Итак, мне нужно построить цепочку команд, которые выполняются последовательно, и мне нужно вызвать откат, если какая-либо из них не сработает. Я хотел бы сделать это как можно яснее и документированнее.

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


Дополнительная информация

Одна из моих главных забот — сделать все ясно. Чтобы уточнить, у меня будет набор запросов, специально предназначенных для:

  • Сократите промежуточную таблицу A' и заполните ее первичными ключами, предназначенными для записей удаления.
  • Удалить из фактической таблицы A на основе соединения с A'
  • Сократите промежуточную таблицу A' и заполните ее полными данными для upserts.
  • Обновление/вставка записей от A до A на основе объединений

Та же логика будет применяться к таблицам B, C, D и т. д. К сожалению, это может быть случай, когда только A и C требуется дополнительный шаг, например, синхронизация удалений с определенной производной таблицей, которая должна быть выполнена после удалений, но до возражает.

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


person John Humphreys    schedule 19.03.2013    source источник
comment
Вы спрашиваете только о том, чтобы сделать ваш код транзакционным, или также о шаблоне для заказа работы на основе динамических зависимостей/условий?   -  person ach    schedule 20.03.2013
comment
Я уже реализовал это, и его транзакция/работает нормально. Я заинтересован в том, чтобы лучше управлять зависимостями (между группами команд).   -  person John Humphreys    schedule 20.03.2013
comment
Похоже, вам нужна какая-то реализация графа. Этот вопрос похож на ваш - он предлагает JGraphT.   -  person ach    schedule 20.03.2013


Ответы (1)


Не пишите такое сами. Именно для этого был создан JTA.

Вы можете использовать либо JPA, либо Spring, чтобы сделать это.

Аннотируйте единицу работы как транзакционную и позвольте базе данных и JDBC обработать ее.

Если вы должны сделать это самостоятельно, следуйте аспектно-ориентированному подходу и сделайте его декоративной реализацией «до и после».

person duffymo    schedule 19.03.2013
comment
шаблон команды, работающий в некоторой среде, поддерживающей JTA, - это то, как я бы сделал это сам. каждая команда в вашей последовательности либо выполняется успешно, либо терпит неудачу, а JTA позаботится о транзакции. различные команды регистрируются в JTA для получения уведомлений о событиях TX (успех/неудача) и действуют соответствующим образом. - person radai; 20.03.2013
comment
Могу ли я использовать JTA, если моя целевая база данных не поддерживает должным образом XA? - person John Humphreys; 20.03.2013
comment
XA означает двухэтапную фиксацию; одна база данных сама по себе не нуждается в этом. - person duffymo; 20.03.2013
comment
Если вы имеете в виду, что моя база данных не поддерживает транзакции, вам либо нужно сменить поставщика базы данных, либо вы SOL. - person duffymo; 20.03.2013