Пакетная вставка/обновление Spring + Atomikos

Мне удалось настроить 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, но, похоже, это не помогло. Любые идеи? Надеюсь, я ясно выразился в своем вопросе! Спасибо


person Giovanni Botta    schedule 28.01.2013    source источник
comment
Хм. Похоже, вам нужен протокол XA, также известный как двухфазная фиксация: en.wikipedia.org/wiki/ Двухфазный_протокол_фиксации atomikos.com/Documentation/WhatIsXa   -  person Frederic Conrotte    schedule 29.01.2013
comment
Нет, это то, что я уже использую (согласно аннотации Transactional). Мне просто интересно, смогу ли я избежать необходимости передавать список. Единственное решение, которое я нашел до сих пор, — хранить записи в буфере, а затем, когда пакет будет завершен, вызвать транзакционный метод, который берет данные из буфера и фиксирует обновления/вставки.   -  person Giovanni Botta    schedule 29.01.2013


Ответы (1)


Что мешает вам извлечь эти 3 метода и вызвать их из insertBatchIntoT1?

person Guy Pardon    schedule 30.03.2013