在我们的应用程序中,我们使用Either
monad 来传达失败。根据Jooq 事务管理文档,@Transactional
和DslContext.transaction
都需要Exception
抛出 以触发事务回滚。我们更愿意根据两者的状态提交或回滚事务。
我们需要的伪代码如下所示:
public class DomainService {
private DSLContext dslContext;
public Either<SomeError, String> businessOperation() {
return transactional(configuration ->
firstDatabaseChange(configuration)
.flatMap(i -> secondDatabaseChange(configuration)));
}
private Either<SomeError, String> firstDatabaseChange(
DSLContext dslContext) {
//Mutate the Db in some way
}
private Either<SomeError, String> secondDatabaseChange(
DSLContext dslContext) {
//Mutate the Db in some way
}
/* How do we implement this method */
private Either<SomeError, String> transactional(Function<DSLContext,
Either<SomeError, String>> function) {
return function.apply(dslContext)
.onSuccess(i -> /*Commit the transaction */)
.onFailure(i -> /*Rollback the transaction*/);
}
}
我有以下transactional
感觉像黑客的方法的工作实现。(有趣的@Transactional
是,即使我们不抛出任何异常,回滚工作也需要注释)。有一个更好的方法吗?
@Transactional
public <T> Either<SomeError, T> transactional(Function<DSLContext,
Either<SomeError, T>> function) {
Connection connection = dslContext.parsingConnection();
try {
connection.setAutoCommit(false);
Either<SomeError, T> either = function.apply(dslContext);
if (either.isSuccess()) {
connection.commit();
} else {
connection.rollback();
}
return result;
} catch (SQLException e) {
log.error("SqlException encountered", e);
return SomeError.failure(e);
} catch (Exception e) {
try {
connection.rollback();
} catch (SQLException e1) {
log.error("Exception encountered while rolling back", e1);
}
return SomeError.failure(e);
}
}
正如Lukas Seder所提到的,Jooq 的路线图上有一个过程 API:github.com/jOOQ/jOOQ/issues/5376
在此发布之前,您可以实现以下所需的行为:
public <T> Either<SomeError, T> transactional(Function<DSLContext,
Either<SomeError, T>> function) {
return dslContext.connectionResult(connection -> {
try {
connection.setAutoCommit(false);
Either<SomeError, T> either = function.apply(dslContext);
if (either.isSuccess()) {
connection.commit();
} else {
connection.rollback();
}
return result;
} catch (SQLException e) {
log.error("SqlException encountered", e);
return SomeError.failure(e);
} catch (Exception e) {
try {
connection.rollback();
} catch (SQLException e1) {
log.error("Exception encountered while rolling back", e1);
}
return SomeError.failure(e);
}
});
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句