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

Spring jpa在回滚期间保存数据

宗政功
2023-03-14

我知道这个问题听起来很奇怪,但推理很简单。我有一个用Spring Hibernate开发的服务器端应用程序。

我有一个自定义servlet:

@Transactional
@Component
public class ReceivingSms implements HttpRequestHandler {
...
...
...
@Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ....reading data from parameters and store into the db....
    entityManager.persist(someEntities);

    //at some point I found that there is some error and I've to rollback the entire transaction
    if(error){
        //HERE I WANT TO SAVE A LOG ON DB
        throw new RuntimeException("Error");
    }
}

原因是这样的:

    < li >我正在读取到达servlet的参数 < li >我将从这些参数导出的一些数据存储在数据库中 < li >在某个时候,我意识到出现了错误,无法完成该过程。所以我抛出一个RuntimeException来回滚整个事务 < li >在返回之前,我想在数据库中保存一个特定的实体(一种日志)。然而,当我尝试时,这个持久化会从RuntimeException回滚

从这里开始,我的问题是:有没有一种方法可以将实体存储在db中并回滚事务的其余部分?

谢谢

共有1个答案

章鸿光
2023-03-14

调用另一个事务服务,其方法用

@Transactional(propagation = Propagation.REQUIRES_NEW)

保存日志条目。

 类似资料:
  • 如果这个链接正确,嵌套事务可能是一个解决方案https://www.credera.com/blog/technology-insights/java/common-oversights-usegry-nested-transactions-spring/

  • Db是MySQL 5.0,Yii版本1.1.12。 如果有任何帮助,我将不胜感激,我几乎被卡住了.....谢谢...

  • 问题内容: 此查询将保存完整的日期和时间。但我只想保存时间而不是数据库中的日期。有任何查询可以做到这一点吗? 问题答案: 您的列必须设置为DATETIME或TIMESTAMP。 如果使用TIME类型,则查询将按预期工作。 如果您使用任何其他类型的列,则可以使用其他答案提到的CURTIME()方法或CAST(column AS TIME),但是这会占用更多的磁盘空间,并且如果使用select会导致查

  • 问题内容: 我正在尝试创建一个保存对象的视图,但是如果引发某些异常,我想 撤消 该保存。这是我尝试的: 我究竟做错了什么?即使引发异常,它仍然在数据库中。 问题答案: 原子性文档 总而言之,如果视图产生的响应没有错误,将在数据库上执行事务。因为您自己正在捕获异常,所以在Django中,您的视图执行得很好。 如果发现异常,则需要自己处理:控制事务 如果在发生故障时需要产生适当的json响应:

  • 我正在使用Spring Boot v2.1.3构建一个应用程序。RELEASE和Hibernate v5.3.6。 之前,我问了一个关于如何跨多个服务/存储库使用@Transactional回滚的问题。我通过使用@OneToOne和@OneToMany注释将我的实体链接在一起,得到了我需要的东西。 现在我面临一个新问题。在单个服务的函数中,我保存了两个单独的实体列表。一个列表保存,另一个列表由于违

  • 我使用: Spring数据(4.x) hikaricp Hibernate(我使用EntityManager) 何时应该将数据提交到数据库?何时或任何时候提交事务? 连接是在整个事务期间保持,还是可以在事务进行到一半时将其返回到池中,然后在需要时请求另一个连接? Spring数据在存储库上不需要@transactional,那么事务参数是什么(传播和隔离)?