У меня есть метод, который передает данные из одной базы данных в другую и в процессе создает новые таблицы в целевой базе данных. Метод является частью EJB без сохранения состояния (Java EE 6, GF 3.1), поэтому контейнер по умолчанию запускает распределенную транзакцию при вызове метода.
Процесс передачи данных по существу выполняется в виде двух отдельных шагов: 1. чтение из исходной базы данных 2. запись в целевую базу данных. Если этап чтения завершается неудачно, я не хочу, чтобы этап записи выполнялся, но если этап записи завершается неудачно и чтение уже завершено, мне все равно - я просто выброшу данные.
Изначально я столкнулся с проблемой, что мои источники данных не были XADataSource, поэтому контейнер пожаловался на это. Затем я преобразовал их в XADataSource, но все равно не получилось, потому что процесс записи (который находится в базе данных MySQL) содержит операторы create table, которые вызывают неявное принятие, и вы не можете сделать это в распределенной транзакции.
Решение, к которому я наконец пришел, состоит в том, чтобы пометить метод передачи как TransactionAttributeType.NOT_SUPPORTED, а затем поместить процесс чтения и записи в их собственные методы, которые вызываются родительским методом передачи.
Мой вопрос, однако, заключается в следующем: методы чтения и записи выполняются внутри своих собственных транзакций или NOT_SUPPORTED распространяется на них? Я предполагаю, что они имеют неявный TransactionAttributeType.REQUIRED и поэтому начнут свою собственную транзакцию, но я не уверен, и я думаю, что важно, чтобы они выполнялись внутри транзакции.
Это лучшее решение этой проблемы?