У меня есть метод, который можно описать с помощью следующих шагов:
- Вставить строки во временную таблицу 1.
- Вставить строки во временную таблицу 2.
- Вставить (внутреннее объединение таблицы 1 + таблица 2) во временную таблицу 3.
- Выбор строк временной таблицы 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, потому что он синхронизирован.
Как я могу решить эту проблему?