加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 01:25:13 所属栏目:大数据 来源:网络整理
导读:我一直在寻找解决方案,但似乎找不到一个好的解决方案. 我有一个复杂的场景,我想评估hibernate乐观锁定与悲观锁定的行为 这样做的最佳位置是在一组良好的集成测试中,但我似乎无法找到一种简单的方法来启动并行事务. 如何在Spring集成测试中创建2个并行事务,而

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

这样做的最佳位置是在一组良好的集成测试中,但我似乎无法找到一种简单的方法来启动并行事务.

>如何在Spring集成测试中创建2个并行事务,而无需手动创建Threads并注入SessionFactory对象.

请注意,我还没有找到一种方法来创建2个并行事务而不会产生至少2个线程(也许有一种方法,我希望你能告诉我一个例子).

最佳答案
添加此作为答案,因为评论上没有足够的空间:

在过去,我通过创建不同的EntityManager / Session并稍后注入它们来测试vanilla Spring.我不确定如何从Spring集成测试中做到这一点,但它可能会引发一个想法.

在下面的代码中,Account是一个版本化的小对象.如果可以使用自定义实体管理器实例化Spring Integration流(或任何调用的流),则可以实现相同的目标.

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();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读