Transactions Jooq事务:若事务中抛出异常,则不会释放到池的连接
我在用HikariCP和Jooq。 守则: *在科特林:Transactions Jooq事务:若事务中抛出异常,则不会释放到池的连接,transactions,kotlin,jooq,Transactions,Kotlin,Jooq,我在用HikariCP和Jooq。 守则: *在科特林: //dataSource is from Hikari DSL.using(dataSource, sqlDialect).transaction { config -> //in create it simply calls dsl.insertInto .... UserRepo.create(User(name="joe"), DSL.using(config)) UserRepo.c
//dataSource is from Hikari
DSL.using(dataSource, sqlDialect).transaction {
config ->
//in create it simply calls dsl.insertInto ....
UserRepo.create(User(name="joe"), DSL.using(config))
UserRepo.create(User(name="foo"), DSL.using(config))
}
一切正常
但如果我抛出block,连接不会关闭(释放)(尽管事务被回滚)
更新:
我是Java新手,所以这是我的错。在测试中,我曾经抛出Kotlin的Throwable
(不是异常
),代码的Java部分没有正确处理它
每件事都按预期进行,但有常规的异常。正如您所注意到的,对于您的问题编辑,jOOQ内部只捕获
异常
子类型,而不是可丢弃的
子类型,以便影响事务管理。在中,您可以看到以下代码(采用版本3.9.6,此问题简称):
试试看{
提供者。开始(ctx);
结果=transactional.run(ctx.configuration());
提交(ctx);
}
捕获(异常原因){//
try {
provider.begin(ctx);
result = transactional.run(ctx.configuration());
provider.commit(ctx);
}
catch (Exception cause) { // <-- This is the problem
ctx.cause(cause);
provider.rollback(ctx);
if (cause instanceof RuntimeException) {
throw (RuntimeException) cause;
}
else {
throw new DataAccessException("Rollback caused", cause);
}
}