[英]jOOQ and Spring transaction management
我使用jOOQ 3.8和Spring Boot 1.4.1。 我看到jOOQ使用一种机制来保证事务的处理 。
如果我将一个注释为事务的方法定义为一个执行二插入,那么它们是否在同一个事务中执行,例如
@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(":)");
}
无论例外情况如何,都会提交事务中的更改吗? (我希望它)
我看到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来说非常好。
如果你这样做:
public doInsert(){
ctx.transaction(configuration -> {
DSL.using(configuration).insertInto(...);
DSL.using(configuration).insertInto(...);
});
}
然后使用jOOQ的事务API,您可能配置或不配置使用spring事务实现。 默认情况下,jOOQ将直接通过JDBC实现事务。
但是,这个:
@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
,则不起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.