我应该如何测试同时使用的事务性服务方法(它通过减少值来更新数据库行)?
我已经使用 SpringJunit4ClassRunner 设置了一个 JUnit 测试类,并且组件是 @autowired。
仅仅生成调用该方法的线程似乎不起作用。不确定这是否与Spring代理机制有关。
我想要实现的是创建一种情况,其中两个线程同时位于测试方法的“内部”,而另一个线程将失败并回滚。例如行值为 3,两个方法调用都尝试将该值减 2;如果该方法不起作用,该值将为-1,这是非法的。但我希望两个调用都失败并回滚,或者尝试比另一个调用晚一瞬间更新它的调用失败。
这可能吗?
最佳答案
第一个问题是事务上下文绑定(bind)到一个线程(具有本地线程)。因此,您必须在每个线程中启动一个事务。 (我认为 Spring 不支持此操作。您可以使用 transaction manager 以编程方式启动事务。)
您描述的代码:读取、递减、写入仅适用于正确的隔离级别(序列化和可重复读取可以工作)。
完成此设置后,您可以通过在一个线程拥有数据库锁时阻塞该线程来测试该行为。您可以使用 Latch为此。
没有数据库锁的线程现在仍然不会回滚。它将阻塞,直到数据库锁再次可用。您描述的方案与 Optimistic concurrency control 非常相似所以也许这已经实现了。
关于java - 测试对事务服务的同时调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1715182/