我的目标是使用单元测试在我的应用程序中引发乐观锁定异常。我已经在理论上了解了如何做到这一点。但我在实践中的问题是如何维护两个线程之间的事务?
所以,这就是我到目前为止所做的:
我正在使用 JUnit 测试:
@RunWith(SpringJUnit4ClassRunner.class)
使用实体管理器org.springframework.orm.jpa.JpaTransactionManager
其中定义了每个方法@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
并开始交易entityManager.getTransaction().begin();
并结束于entityManager.getTransaction().rollback());
这在单线程测试中效果很好,可以保存、更新等。
为了创建多个线程,我使用 Springs TaskExecutor (类似于此处描述的内容:有没有好的带有 TaskExecutor 的 Spring 线程示例? https://stackoverflow.com/questions/852743/any-good-spring-threading-with-a-taskexecutor-examples)
但是我该怎么做才能维持两个线程之间的事务呢?我尝试过使用 @Transactional 注释 run() 方法,但这不起作用。
我想到的几个问题——
全球交易
您的所有线程都应该属于同一事务吗?这意味着,如果一个线程抛出异常,是否要回滚其他线程中的更改?
本地交易每个线程是否应该有自己的事务边界而不影响其他线程?在这种情况下,一个线程中的异常和回滚不会影响其他线程。
要实现全局事务,您很可能必须使用具有适当资源驱动程序的 JTA 事务管理器。 Spring默认不支持全局事务。如果您的应用程序在 Java EE 应用程序服务器(Jboss、Weblogic)中运行,则默认情况下您将获得 JTA 支持,并且您可以配置 spring 以使用应用程序服务器的事务管理功能。
如果您在 tomcat 中运行,您可以插入一个开源 JTA 实现,例如 -
Atomikos http://www.atomikos.com/
Jboss交易 http://www.jboss.org/jbosstm
为了实现本地事务(即每个线程都有自己的事务边界),我认为除了使用 spring 事务注释之外,您不需要做任何其他事情。
在下面的示例中,只需确保“service”是一个 spring bean,并且 doSomething() 已被适当注释。
taskExecutor.execute( new Runnable() {
public void run() {
service.doSomething( );
}
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)