4

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

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

我正在使用 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() 方法之类的东西,但这不起作用。

4

1 回答 1

6

想到的几个问题——

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

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

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

阿托米科斯

Jboss 交易

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

taskExecutor.execute( new Runnable() {
           public void run() {
                service.doSomething( );
           }
      });
于 2012-10-26T14:17:59.433 回答