【问题标题】:Spring @Transactional method called by multithread(multi-request)多线程(多请求)调用的Spring @Transactional方法
【发布时间】:2016-12-30 05:40:49
【问题描述】:

Java 网络
Spring MVC 框架

在我的服务级别,我写了一个@Transactional 方法。在该方法中,我更新了数据库中的一些数据,然后稍后从数据库中读取数据。 令我惊讶的是,当多个请求到来时,在同一个线程中,数据更改是可见的(应该是),但数据更改在其他线程中不可见。
一种方法的不同线程不是构建为一个事务吗?
而如果我还想用事务,又想让不同线程调用的同一个方法在一个事务中(数据的变化可以互相看到)怎么办?

【问题讨论】:

    标签: java spring multithreading spring-mvc transactions


    【解决方案1】:

    来自Professional Java for Web Applications by Nicholas S. Williams

    为事务和实体管理器使用线程

    事务范围仅限于事务开始的线程。然后,事务管理器将事务链接到事务生命周期内同一线程中使用的托管资源。使用Java Persistence API 时,您使用的资源是EntityManager。它在功能上等同于 Hibernate ORM 的 Session 和 JDBC 的 Connection。通常,您会在开始事务和执行 JPA 操作之前从EntityManagerFactory 获得EntityManager。但是,这不适用于代表您管理事务的 Spring Framework 模型。 这个问题的解决方案是org.springframework.orm.jpa.support.SharedEntityManagerBean。在 Spring Framework 中配置 JPA 时,它会创建一个代理 EntityManager 接口的 SharedEntityManagerBean。然后将此代理注入到您的 JPA 存储库中。在此代理实例上调用 EntityManager 方法时,会在后台发生以下情况:

    ➤➤ 如果当前线程已经有一个真正的EntityManager 和一个活动事务,它会将调用委托给该EntityManager 上的方法。

    ➤➤ 否则,Spring Framework 从 EntityManagerFactory,启动一个事务,并将两者绑定到当前线程。然后它将调用委托给EntityManager 上的方法。当事务被提交或回滚时,Spring 将事务和EntityManager 从线程中解除绑定,然后关闭EntityManager。同一线程上的未来@Transactional 操作(即使在同一请求中)再次启动该过程,从工厂获得一个新的EntityManager 并开始一个新事务。这样,没有两个线程同时使用EntityManager,并且给定线程在任何给定时间只有一个事务和一个EntityManager处于活动状态。

    (我在上面的文章中稍微解释了一下)

    我认为它不言自明并回答了您的问题。但是我想补充一点,如果您不使用Spring MVC,那么您将在Hibernate 中使用SessionFactory 获得会话。 Hibernate Sessions 代表事务从开始到结束的生命周期。根据您的应用程序的架构方式,这可能不到一秒或几分钟;在 Web 应用程序中,它可以是请求中的多个事务之一、持续整个请求的事务或跨越多个请求的事务。 Session 不是线程安全的,并且一次只能在一个线程中使用,它负责管理实体的状态。

    【讨论】:

      【解决方案2】:

      你可能想玩isolation参数@Transactional注解。 Spring 默认使用.. hm.. DEFAULT 由数据库设置,因此可能会有所不同。您可以尝试使用:READ_UNCOMMITTED。更多信息:http://www.byteslounge.com/tutorials/spring-transaction-isolation-tutorial

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多