jOOQ和Spring事务管理

时间:2016-10-11 19:56:12

标签: java spring transactions jooq

我使用jOOQ 3.8和Spring Boot 1.4.1。 我看到jOOQ使用一种机制来保证handling of transactions

如果我定义一个注释为事务性的方法并且在执行两个插入内部,它们是在同一个事务中执行的,例如。

@Transactional(propagation = Propagation.MANDATORY)
public doInsert(){
    DSL.using(configuration).insertInto(...);
    DSL.using(configuration).insertInto(...);
}
如果出现异常,

是否会执行所有执行的插入回滚?它们会在一次交易中执行吗?

或者,我应该这样做:

public doInsert(){
  create.transaction(configuration -> {

    DSL.using(configuration).insertInto(...);
    DSL.using(configuration).insertInto(...);    
  });
}

如果我按照以下方式使用注释和jOOQ事务会发生什么:

@Transactional(propagation = Propagation.MANDATORY)
public doInsert(){
  create.transaction(configuration -> {

    // Wrap configuration in a new DSLContext:
    DSL.using(configuration).insertInto(...);
    DSL.using(configuration).insertInto(...);    
  });
  throw new RuntimeException(":)");
}

无论异常如何,都会提交事务中的更改吗? (我希望如此)

1 个答案:

答案 0 :(得分:5)

  

我看到jOOQ使用一种机制来保证交易的处理。

jOOQ实际上并没有这样做。 jOOQ提供了一个API,可以通过lambda方便地使用事务。然而,API由您(或间接地,由Spring)通过jOOQ TransactionProvider SPI实现。

仅使用弹簧(最简单)

假设:

DSLContext ctx = ...

如果你这样做:

@Transactional(propagation = Propagation.MANDATORY)
public doInsert(){
    ctx.insertInto(...);
    ctx.insertInto(...);
}

您根本没有使用jOOQ的交易API,您只使用了spring,这对于jOOQ来说非常好。

使用jOOQ(可能是幕后的春天)

如果你这样做:

public doInsert(){
  ctx.transaction(configuration -> {
    DSL.using(configuration).insertInto(...);
    DSL.using(configuration).insertInto(...);    
  });
}

然后使用jOOQ的事务API,您可能配置或不配置使用spring事务实现。默认情况下,jOOQ将直接通过JDBC实现事务。

使用两种API

但是,这个:

@Transactional(propagation = Propagation.MANDATORY)
public doInsert(){
  ctx.transaction(configuration -> {

    // Wrap configuration in a new DSLContext:
    DSL.using(configuration).insertInto(...);
    DSL.using(configuration).insertInto(...);    
  });
  throw new RuntimeException(":)");
}

目前(jOOQ 3.8)如果没有实现在当前线程的上下文中检测spring的声明式事务范围的相当复杂的TransactionProvider,则无效。