Как использовать временные таблицы с параллелизмом в транзакции? - PullRequest
0 голосов

У меня есть метод, который можно описать с помощью следующих шагов:

  1. Вставить строки во временную таблицу 1.
  2. Вставить строки во временную таблицу 2.
  3. Вставить (внутреннее объединение таблицы 1 + таблица 2) во временную таблицу 3.
  4. Выбор строк временной таблицы 3.

Шаги выполняются последовательно. Однако это медленный метод, и я хочу распараллелить STEP1 и STEP 2, потому что они независимы. Важно знать, что у 3 временных таблиц есть пункт «ON COMMIT DELETE ROWS», поэтому все шаги должны выполняться в одной транзакции.

private void temporaryTables() {

    String st1 = "insert into table1(name) values('joe')";
    String st2 = "insert into table2(name) values('foo')";

    jdbcTemplate.update(st1);
    jdbcTemplate.update(st2);

    //Arrays.asList(st1,st2).parallelStream().map(x -> {
    //    jdbcTemplate.update(x);
    //});
    //if I use parallel stream and I select both tables, one table is empty.

}

@Transactional
public List<Response> method() {
    temporaryTables();
    return jdbcTemplate.query(SELECT_TABLE_3, new BeanPropertyRowMapper<>(Response.class));
}

Если я раскомментирую параллельный код, он не будет работать должным образом. Он работает только с потоком вызывающей стороны, другой поток не будет выполняться в той же транзакции, и из-за этого STEP 3 завершится сбоем, поскольку одна временная таблица пуста.

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

Как я могу решить эту проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...