代码之家  ›  专栏  ›  技术社区  ›  egaga

测试对事务性服务的同时调用

  •  2
  • egaga  · 技术社区  · 15 年前

    我应该如何测试同时使用的事务性服务方法(它通过减少值来更新数据库行)?

    我用SpringJunit4ClassRunner设置了一个JUnit测试类,组件是@autowired。

    只是生成调用该方法的线程似乎不起作用。我不确定这是否与Spring代理机制有关。

    我想实现的是创建一种情况,在这种情况下,两个线程同时处于被测试方法的“内部”,另一个线程将失败并回滚。例如,行值为3,两个方法调用都试图将值减少2;如果方法不起作用,则值将为-1,这是非法的。但我希望这两个调用都失败并回滚,或者让试图更新它的调用比另一个调用晚一分钟失败。

    这是可能的吗?

    1 回复  |  直到 15 年前
        1
  •  4
  •   Thomas Jung    15 年前

    第一个问题是事务上下文是 绑定到一个线程 (有局部线程)。所以您必须在每个线程中启动一个事务。(我认为在春天没有支持这一点。您可以使用 transaction manager )

    您所描述的代码:读、减、写只对右边的代码有效。 隔离级别 (序列化和可重复读取将起作用)。

    完成此设置后,可以通过在线程具有数据库锁的情况下阻塞一个线程来测试行为。你可以使用 Latch 为此。

    没有数据库锁的线程现在仍然不会回滚。它将一直阻塞,直到数据库锁再次可用。你所描述的计划与 Optimistic concurrency control 所以这可能已经实现了。