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

Spring数据JPA和事务管理

慕容坚
2023-03-14

在我的spring服务中,我调用了两个spring数据存储库方法

@Service
public class ClientService {
    public void updateClientByIdAndKey(final Integer id, final String key) {
        final Client client = clientRepository.findByIdAndKey(id, key);
        // .. Update client details
        client.save(client);
   }
}

现在我的查询与事务管理相关。就我所了解和看到的代码而言,spring存储库使用@Transactional为其方法启用了事务。对于html" target="_blank">select操作,它的readonly=true。

我对事务的理解是,当执行选择操作时,会创建一个事务,然后为保存操作创建另一个事务,因为对于选择操作,事务只读=true。

我希望在单个事务中执行读写操作。如果我以上的理解是正确的,那么让@Transactional over service method updateClientByIdAndKey在一个事务中同时运行这两个操作是我的意图还是spring在一个事务中同时执行这两个操作?

如果我遗漏了什么,请告诉我。

共有3个答案

方建明
2023-03-14

方法findByIdAndKey不需要进行提交(将更改存储到数据库),应该注释为

@Transactional(readOnly = true)

updateClientByIdAndKey应使用的方法

@Transactional

在updateClientByIdAndKey中,只使用一个读写事务,除非您的嵌套方法findByIdAndKey定义了

@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)

在这种情况下,您正在显式创建一个没有意义的新(只读)事务。

仇建茗
2023-03-14

将事务性注释添加到updateClientByIdAndKey方法时,spring将只创建一个读写事务(除非在使用传播的FindByiAndKey/save方法上添加了额外的>事务性注释,否则需要新的或其他类型的传播。当您将readOnly=true添加到时,事务性spring将在Hibernate会话上设置flushMode,将设置为NEVER。这意味着您无法执行任何创建,更新、删除操作。

夹谷斌蔚
2023-03-14

@Transactional的只读属性默认为false。通过简单地用事务性注释方法,读取/选择操作和更新操作都将在单个事务中发生。如果您将属性更改为true,我猜您不会有两个事务发生,而是会在尝试更新时引发异常。

编辑:如果方法没有使用事务性注释,则两个操作都不会在单个事务中执行。事实上,根据您如何配置ORM,在执行更新时可能会引发异常,因为在选择之后连接将被关闭。

 类似资料:
  • 我正在使用spring数据jpa为我的服务实现多事务(数据库),带有两个持久的单元名。并在Jboss 6.4 EAP中部署 以下是我的服务详情 在Jboss中,我无法部署它,我遇到以下异常: 原因:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有com.test.demo.domain.repository.Tb

  • 我创建了一个示例--SPRING,JPA(EclipseLink持久性提供程序)和JTA事务管理器(JBoss7)。我观察到数据库中的所有数据都正确地显示在UI中以进行读操作。但是当涉及保存/更新或删除操作时,服务层不将工作提交到数据库。没有捕获到异常(我也检查了控制台/日志,并且调试了代码,可以看到EntityManager.persist/remove被调用,没有任何异常)。 > module

  • 根据java docs for@Lock Annotation: 用于指定执行查询时要使用的LockModeType的注释。在查询方法上使用Query或从方法名称派生查询时,将评估它。 如上所述,将使用@Query annotation或findBySomething对其进行评估。。()方法。 但根据我的发现,当我在任何方法中使用@Transactional放置@Lock注释,并在该事务方法中从d

  • 我挣扎了两天试图解决这个问题,我不知道我还能做什么。在我将< code>@Audit包含在实体中之前,我的系统工作得非常好。当然,我在。pom文件。 我已经尝试过这些帖子: Hibernare envers Audit with Spring data JPA 和 Spring Boot Spring-data-enverHibernatejava.lang.NoSuch方法错误:org.hibe

  • 我有一个Spring mvc rest webservice,它带有一个保存数据源地图的数据源管理器bean。每个客户都有自己的数据库,因此也有自己的数据源。webservice以编程方式从DataSourceManager加载客户数据源,如果不存在,则创建一个新的。 通过这种实现,可以使用注释驱动的事务管理吗?我阅读的所有示例都在配置文件中声明了一个或多个数据源。

  • 我正在尝试用Java创建一个PoC应用程序,以了解在使用Kafka进行消息发布时如何在Spring Cloud Stream中进行事务管理。我试图模拟的用例是一个接收消息的处理器。然后,它进行一些处理,并生成两条发送到两个不同主题的新消息。我希望能够将这两条消息作为单个事务发布。因此,如果发布第二条消息失败,我希望滚动(而不是提交)第一条消息。SpringCloudStream支持这样的用例吗?