Transactions 有没有一种方法可以在JooQ中以编程方式回滚事务?

Transactions 有没有一种方法可以在JooQ中以编程方式回滚事务?,transactions,jooq,Transactions,Jooq,在我们的应用程序中,我们使用或monad来传递失败。根据文档,@Transactional和DslContext.transaction都需要抛出异常来触发事务回滚。我们更愿意根据事务的状态提交或回滚事务 我们需要的Psuedo代码如下所示: 公共类域服务{ 私人语境; 公共业务运营(){ 返回事务(配置-> firstDatabaseChange(配置) .flatMap(i->secondDatabaseChange(配置)); } 私有数据库更改( DSLContext(DSLContex

在我们的应用程序中,我们使用
monad来传递失败。根据文档,
@Transactional
DslContext.transaction
都需要抛出
异常来触发事务回滚。我们更愿意根据事务的状态提交或回滚事务

我们需要的Psuedo代码如下所示:

公共类域服务{
私人语境;
公共业务运营(){
返回事务(配置->
firstDatabaseChange(配置)
.flatMap(i->secondDatabaseChange(配置));
}
私有数据库更改(
DSLContext(DSLContext){
//以某种方式改变数据库
}
私有数据库更改(
DSLContext(DSLContext){
//以某种方式改变数据库
}
/*我们如何实现这个方法*/
私有或事务(功能){
返回函数.apply(dslContext)
.onSuccess(i->/*提交事务*/)
.onFailure(i->/*回滚事务*/);
}
}
我有以下感觉像是黑客的
事务性
方法的工作实现。(有趣的是,
@Transactional
注释是回滚工作所必需的,即使我们没有抛出任何异常)。有更好的方法吗

@Transactional
公共事务(功能){
Connection Connection=dslContext.parsingConnection();
试一试{
connection.setAutoCommit(false);
或者=function.apply(dslContext);
if(isSuccess()之一){
commit();
}否则{
connection.rollback();
}
返回结果;
}捕获(SQLE异常){
log.error(“遇到SqlException”,e);
返回一些错误。失败(e);
}捕获(例外e){
试一试{
connection.rollback();
}捕获(SQLException e1){
log.error(“回滚时遇到异常”,e1);
}
返回一些错误。失败(e);
}
}
如所述,Jooq的路线图上有一个过程API:github.com/Jooq/Jooq/issues/5376

在发布之前,您可以实现以下所需的行为:

公共事务(功能){
返回dslContext.connectionResult(连接->{
试一试{
connection.setAutoCommit(false);
或者=function.apply(dslContext);
if(isSuccess()之一){
commit();
}否则{
connection.rollback();
}
返回结果;
}捕获(SQLE异常){
log.error(“遇到SqlException”,e);
返回一些错误。失败(e);
}捕获(例外e){
试一试{
connection.rollback();
}捕获(SQLException e1){
log.error(“回滚时遇到异常”,e1);
}
返回一些错误。失败(e);
}
});
}

我不知道您为什么认为您的实现是一个黑客行为。你只需要自己做就行了。您不妨从问题中删除实现,并将其作为您自己问题的答案。@LukasEder感谢您的快速回复。我希望Jooq中有另一个API(我没有注意到),它允许我实现这一点,而不必降低到
连接级别。此外,我担心直接使用
parsingConnection
的影响。您是否知道为什么仍然需要
@Transactional
来实现此功能?路线图上有一个替代的过程API:。我不知道
parsingConnection
是如何关联的,也不知道这里为什么涉及
@Transactional
。我想你的问题还不完全,关于后者…
parsingConnection
被标记为实验性功能。因此,我想知道它在用于事务管理时是否会有任何问题。从您链接的问题中,我发现我可以使用
dslContext.connectionResult
来实现相同的结果
@Transactional
在理想情况下不应该出现,但我们发现
连接.rollback()
在缺少注释时实际上似乎没有任何作用。然而,这可能与我们的应用程序的设置方式有关。哦,您刚才试图从jOOQ获得任何JDBC
连接
?是的,
DSLContext.connection()
connectionResult()
是正确的选择。不要使用
parsingConnection()
。Javadoc非常清楚它的用途:)