当前位置: 首页 > 知识库问答 >
问题:

Spring启动:使用@Transactional进行手动回滚

越运锋
2023-03-14

是否可以混合事务程序化和基于注释的管理?默认情况下,@Transactional会在任何运行时进行回滚并重新抛出它。

我不想重播它,但返回可选。空()有可能吗?使用事务编程管理很容易实现:(我从Spring文档中获取了示例)

transactionTemplate.execute(new TransactionCallbackWithoutResult() {

    protected (Optional<User>) doInTransactionWithoutResult(TransactionStatus status) {
        try {
            doStuff();
            return createUser();
        } catch (RuntimeException ex) {
            status.setRollbackOnly();
            return Optional.empty();
        }
    }
});

有可能以一种好的方式将它们结合起来吗?让我们说:

@Transactional
Optional<User> manageUser() {
  try {
    doStuff();
    return createUser();
  } case (RuntimeException e) {
     SomeTransactionalClass.setRollbackOnly();
     return Optional.empty();
  }
}

你认为,混合使用两种管理事务的方法是一种代码气味吗?

谢谢你。

共有1个答案

酆勇
2023-03-14

我想到的第一个解决方案是在捕捉块上处理它,这与你找到的解决方案相同。

 类似资料:
  • 从2.0.6开始使用spring boot starter test会带来JUnit 4依赖性。如何使用spring boot starter test(通过Gradle),但使用JUnit 5,而不引入JUnit 4依赖项? 如果有帮助,这是Gradle的部分依赖输出: 这是我的身材。gradle文件: 添加JUnit 5依赖项并执行注释中提到的排除就完成了。测试依赖项现在如下所示:

  • 问题内容: 如果运行以下命令,Redis会正确启动: 我添加了我的启动脚本: 但是,当我从全新启动中启动时,Redis无法运行。我应该在哪里解决此问题? 问题答案: 这个东西通常设置为20。现在,redis需要联网还为时过早。 因此,请尝试以下操作:

  • 我正在使用Spring Boot和Google App Engine,以及使用MySQL的Google Cloud SQL。。在本地,它工作正常,但在部署到谷歌应用程序引擎后,该网站没有加载。我查看了Google的错误报告,发现了这个异常。 请建议如何解决此问题。 在我的应用程序中。属性 例外情况:

  • 我有一个需要执行LDAP查询的Spring启动应用程序。我正在尝试从Spring启动文档中获取以下建议: Internet上已经发布了许多使用XML配置的Spring配置示例。如果可能,请始终尝试使用等效的基于Java的配置。 在Spring XML配置文件中,我会使用: 我如何使用基于Java的配置来配置它?我需要能够更改ldap的URL、base、用户名和密码属性:上下文源,而无需代码重建。

  • 我使用的是,我想配置将不同的内容异步记录到不同的日志文件中。 我创建了log4j2文件,但是仍然使用Spring Boot默认日志记录。如何切换日志记录?

  • 我正在尝试从Spring Boot应用程序连接到Microsoft SQL Server 2016。SQL server是使用windows身份验证配置的。 以下是配置 注意:我正在使用Windows身份验证。 谁能帮忙吗?