集成测试中的spring启动并行事务

集成测试中的spring启动并行事务,spring,hibernate,integration-testing,spring-transactions,Spring,Hibernate,Integration Testing,Spring Transactions,我一直在寻找解决办法,但似乎找不到一个好办法。 我有一个复杂的场景,我想评估hibernate乐观的锁定与悲观的锁定的行为 做这件事最好的地方是在一组好的集成测试中,但我似乎找不到启动并行事务的干净方法 如何在spring集成测试中创建2个并行事务,而不必手动创建线程和注入SessionFactory对象 请注意,我还没有找到一种在不产生至少两个线程的情况下创建两个并行事务的方法(也许有一种方法,我希望您能给我举个例子)。添加此作为答案,因为注释上没有足够的空间: 在过去,我通过创建不同的E

我一直在寻找解决办法,但似乎找不到一个好办法。 我有一个复杂的场景,我想评估hibernate乐观的锁定与悲观的锁定的行为

做这件事最好的地方是在一组好的集成测试中,但我似乎找不到启动并行事务的干净方法

  • 如何在spring集成测试中创建2个并行事务,而不必手动创建线程和注入SessionFactory对象

请注意,我还没有找到一种在不产生至少两个线程的情况下创建两个并行事务的方法(也许有一种方法,我希望您能给我举个例子)。

添加此作为答案,因为注释上没有足够的空间:

在过去,我通过创建不同的EntityManager/Session并随后注入它们,在vanilla Spring上进行了测试。我不确定如何通过Spring集成测试实现这一点,但它可能会激发一个想法

在下面的代码中,Account是一个版本控制的小对象。如果可以使用自定义实体管理器实例化Spring集成流(或任何被调用的流),那么您也可以实现同样的目标

public void shouldThrowOptimisticLockException() {
      EntityManager em1 = emf().createEntityManager();
      EntityManager em2 = emf().createEntityManager();
      EntityTransaction tx1 = em1.getTransaction();
      tx1.begin();

      Account account = new Account();
      account.setName("Jack");
      account.updateAudit("Tim");

      em1.persist(account);
      tx1.commit();


      tx1.begin();
      Account account1 = em1.find(Account.class, 1L);
      account1.setName("Peter");

      EntityTransaction tx2 = em2.getTransaction();
      tx2.begin();
      Account account2 = em2.find(Account.class, 1L);
      account2.setName("Clark");

      tx2.commit();
      em2.close();

      tx1.commit(); //exception is thrown here
      em1.close();
}

您不能,因为您至少需要一个额外的线程。事务和资源管理是基于线程的,所以只要你没有两个线程,这将是非常困难和复杂的…好吧,所以没有任何办法不产生线程。。。是否有一个spring测试实用程序用于执行此操作?或者某个地方的代码示例?如果你说并行,你的代码中必须有2个线程,否则你做的测试很糟糕。为什么不想创建新线程?因为我想保持测试干净。没有花哨的线程创建和实体管理器。在我看来,锁定是一个非常常见的测试。尤其是在集成中,当您希望了解系统的各个部分的行为时。