如何在事务中使用具有并行性的临时表?

时间:2019-05-10 20:28:51

标签: java oracle spring-boot parallel-processing transactions

我有一种可以用以下步骤描述的方法:

  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对象,因为它是同步的。

我该如何解决这个问题?

0 个答案:

没有答案