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

只对错误的对象进行Spring事务回滚,并隐藏它的堆栈跟踪

桓修能
2023-03-14

我有100个对象,我想将其保存到数据库。

@Service
public class TestService {

  private final TestDao testDao;

  public TestService(TestDao testDao) {
    this.testDao = testDao;
  }

  @Transactional
  public void saveTest() {
    for (int i = 0; i < 100; i++) {
      Test test = new Test();
      if (i == 10 || i == 20) {
        test.setName("123");
      } else {
        test.setName(UUID.randomUUID().toString());
      }
      testDao.save(test);
    }
  }
}

我对“名称”列有uniq约束,如果我尝试用某个名称保存2个对象,就会出现异常

我需要保存99个对象(唯一的名称),并跳过一个重复的名称对象。但是如果我尝试插入dublicate,我会得到一个异常,事务回滚所有对象。我改变我的刀savee()方法:

@Slf4j
@Repository
public class TestDao {

  @PersistenceContext
  private EntityManager entityManager;

  @Transactional(propagation = Propagation.REQUIRES_NEW)
  public void save(Test test) {
    entityManager.persist(test);
  }
}

Propagation.REQUIRES_NEW - 在每个对象上启动内部事务,并且仅对rollbak对象进行配音。它很好。但是在日志打印中,此异常堆栈跟踪/如何隐藏此堆栈?

共有1个答案

狄天逸
2023-03-14

您可以为您的日志框架编写日志过滤器(例如,Logback Filter)。

依我看,这可能是一种黑客行为,你应该做的是在保存之前验证你的对象。

这样,您可以确保整个“批”都可以提交。

 类似资料:
  • 问题内容: 我正在使用TestNG 6.9.9来构建回归测试环境。但是遇到使用JUnit时从未遇到过的问题。在我看来,当每个测试用例完成时,如果测试方法在与调用方法相同的事务上下文中运行,则默认情况下将自动回滚每个数据的更改。但这似乎不是事实,而且我无法找出我的代码中是否有任何错误。请帮帮我。pom.xml中的属性,指示框架的版本 显然,它们都是最新的。 我的测试课: 创建一个实体实例,然后调用c

  • 输入=堆栈数 但是你只能弹出输入,你不能推到它。输出也是另一个堆栈,你可以返回并推到它,但不能弹出 所以如果 由于您无法在中返回到

  • 我已经阅读了Spring@Transactional-Isolation,propagation中的指令 但是我不明白我解释的这个特性是如何产生的:我有一个异步方法,像这样 此方法(setFlag)在调用异步方法之前通过1L调用一次 并且在异步方法中的所有操作结束时传递零 但是,如果异步方法因某些问题而失败,则catch分支中的调用将失败,因为 且标志保持为1。 所以,我希望我是清楚的,但是...

  • 我在尝试资源方面有问题,我只是想确认一下。如果我需要对异常做出反应,并且我仍然需要catch块中的资源,我可以使用它吗?示例如下: 我担心在这种情况下,我仍然注定要使用旧的try-catch-最终,即使根据甲骨文留档-“在try-with-资源语句中,任何一抓或最终块都是在声明的资源被关闭后运行的。”

  • 问题内容: 我在尝试资源时遇到问题,我只是想确定一下。如果我需要对异常做出反应并且仍然需要catch块中的资源,可以使用它吗?给出的示例是这样的: 我担心即使在oracle文档中,我仍然注定要在这种情况下最终使用旧的try-catch-finally-“在try-with- resources语句中捕获并最终阻止,任何catch或finally块都在资源之后运行宣布已关闭。” 问题答案: 根据语言

  • 我们为JPA配置了Spring数据。服务事务方法不会因错误而回滚(例如,DB ConstraintViolationException)。 我能找到的最接近的是这个(事务不回滚)Spring-data、JTA、JPA、Wildfly10但是我们没有任何XML配置,我们所有的配置都是基于Java的。 本质上,服务方法如下所示:不捕获错误,抛出所有内容。