Мне удалось настроить spring + atomikos для глобальных транзакций в нескольких базах данных, например, транзакционное обновление или вставка записей. Я использовал аннотацию @Transactional вместе с классами SqlUpdate или BatchSqlUpdate для выполнения транзакций базы данных. Вот пример кода:
@Transactional
public void insertBatchIntoT1(List<Integer> ids, List<String> names) {
Map<String, Object> params = new HashMap<>();
for (int i = 0; i < ids.size(); i++) {
int id = ids.get(i);
String name = names.get(i);
params.put("id", id);
params.put("name", name);
for (BatchSqlUpdate u : insertIntoT1)
u.updateByNamedParam(params);
}
for (BatchSqlUpdate u : insertIntoT1)
u.flush();
}
Метод принимает список идентификаторов и имен (это также может быть список пользовательских POJO), и для каждого элемента в списке он устанавливает параметры в каждом пакетном обновлении, определенном для каждого объекта DataSource (используя подготовленный оператор, определенный при инициализации) и выполняет обновление для каждого. Затем BatchSqlUpdate сбрасывается для каждого источника данных. Мне было интересно, можно ли это сделать по-другому: можно ли постепенно добавлять записи в BatchSqlUpdate без запуска фиксации? Например, я хотел бы иметь возможность определить три метода: startBatchUpdate(), addToBatch(int id,String name) и flushBatch() и иметь одну транзакцию между вызовом первого и третьего метода. Я попытался использовать атрибут Propagation.REQUIRED, но, похоже, это не помогло. Любые идеи? Надеюсь, я ясно выразился в своем вопросе! Спасибо