【问题标题】:Transaction in JPA using multiple threadsJPA中使用多线程的事务
【发布时间】:2012-10-15 17:30:09
【问题描述】:

我的目标是使用单元测试在我的应用程序中引发乐观锁定异常。我已经在理论上了解了如何做到这一点。但我在实践中遇到的问题是如何维护两个线程之间的事务?

所以,这就是我到目前为止所做的:

我正在使用 JUnit 测试:

@RunWith(SpringJUnit4ClassRunner.class)

使用 EntityManager org.springframework.orm.jpa.JpaTransactionManager

每个方法在哪里被定义@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)

并以entityManager.getTransaction().begin(); 开始事务并以entityManager.getTransaction().rollback()); 结束

这很好用,在单线程测试中保存、更新等。

为了创建多个线程,我使用 Springs TaskExecutor(类似于这里描述的:Any good Spring threading with a TaskExecutor examples?)

但是我必须做些什么来维护两个线程之间的事务呢?我尝试过使用 @Transactional 注释 run() 方法之类的东西,但这不起作用。

【问题讨论】:

  • 事务上下文在 ThreadLocal 中维护,一般不会跨多个线程传播。
  • 对替代品有什么建议吗?
  • 可能是如果您使用容器管理的线程(如 websphere workmanaer),容器可能会跨线程传播上下文。我不确定只是大声思考。
  • 这与您尝试做的类似吗? stackoverflow.com/questions/2455794/…

标签: java spring jakarta-ee jpa


【解决方案1】:

想到的几个问题 -

全球交易
您的所有线程都应该属于同一事务吗?其含义是,如果一个线程抛出异常,您是否要回滚其他线程中的更改?

本地交易 每个线程是否应该有自己的事务边界而不影响其他线程?在这种情况下,一个线程中的异常和回滚不会影响其他线程。

要实现全局事务,您很可能必须使用具有适当资源驱动程序的 JTA 事务管理器。 Spring 没有对全局事务的默认支持。如果您的应用程序在 Java EE 应用程序服务器(Jboss、Weblogic)中运行,则默认情况下您会获得 JTA 支持,并且您可以配置 spring 以使用应用程序服务器的事务管理功能。 如果您在 tomcat 中运行,您可以插入一个开源 JTA 实现,例如 -

Atomikos

Jboss Transactions

为了实现本地事务(即,每个线程都有自己的事务边界),我认为除了使用 spring 事务注释之外你不需要做任何事情。 在下面的示例中,只需确保 'service' 是一个 spring bean 并且 doSomething() 被适当地注释。

taskExecutor.execute( new Runnable() {
           public void run() {
                service.doSomething( );
           }
      });

【讨论】:

  • 当我使用 weblogic 时,让我们谈谈第一个(全局事务)。我应该如何配置 taskExecutor 以使用全局事务
猜你喜欢
  • 2016-06-04
  • 1970-01-01
  • 2012-05-11
  • 2019-02-10
  • 2018-05-14
  • 1970-01-01
  • 2011-09-24
  • 2018-12-19
  • 1970-01-01
相关资源
最近更新 更多