jOOQ和Spring事务管理

mat*_*boy 9 java spring transactions jooq

我使用jOOQ 3.8和Spring Boot 1.4.1.我看到jOOQ使用一种机制来保证事务的处理.

如果我将一个注释为事务的方法定义为一个执行二插入,那么它们是否在同一个事务中执行,例如

@Transactional(propagation = Propagation.MANDATORY)
public doInsert(){
    DSL.using(configuration).insertInto(...);
    DSL.using(configuration).insertInto(...);
}
Run Code Online (Sandbox Code Playgroud)

如果发生异常,所有执行的插入回滚吗?它们会在一次交易中执行吗?

或者,我应该这样做:

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

    DSL.using(configuration).insertInto(...);
    DSL.using(configuration).insertInto(...);    
  });
}
Run Code Online (Sandbox Code Playgroud)

如果我使用注释和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(":)");
}
Run Code Online (Sandbox Code Playgroud)

无论例外情况如何,都会提交事务中的更改吗?(我希望它)

Luk*_*der 9

我看到jOOQ使用一种机制来保证事务的处理.

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

仅使用弹簧(最简单)

鉴于:

DSLContext ctx = ...
Run Code Online (Sandbox Code Playgroud)

如果你这样做:

@Transactional(propagation = Propagation.MANDATORY)
public doInsert(){
    ctx.insertInto(...);
    ctx.insertInto(...);
}
Run Code Online (Sandbox Code Playgroud)

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

使用jOOQ(可能在幕后使用弹簧)

如果你这样做:

public doInsert(){
  ctx.transaction(configuration -> {
    DSL.using(configuration).insertInto(...);
    DSL.using(configuration).insertInto(...);    
  });
}
Run Code Online (Sandbox Code Playgroud)

然后使用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(":)");
}
Run Code Online (Sandbox Code Playgroud)

目前(jOOQ 3.8)如果没有实现TransactionProvider在当前线程的上下文中检测spring的声明性事务范围的相当复杂的东西,则无法工作.