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

时间:2009-11-11 13:31:47

标签: java multithreading spring junit transactional

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

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

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

我想要实现的是创建一种情况,其中两个线程同时在测试方法的“内部”,而另一个线程将失败并回滚。例如行值为3,两个方法调用都尝试将值减小2;如果方法不起作用,则值为-1,这是非法的。但是我希望这两个调用都失败并回滚,或者试图在另一个之后立即更新它的那个失败。

这甚至可能吗?

1 个答案:

答案 0 :(得分:4)

第一个问题是事务上下文绑定到一个线程(带有本地线程)。所以你必须在每个线程中启动一个事务。 (我认为春天没有这方面的支持。您可以使用transaction manager以编程方式启动交易。)

您描述的代码:读取,递减,写入仅适用于正确的隔离级别(序列化和可重复读取将起作用)。

完成此设置后,您可以通过在数据库锁定时阻止一个线程来测试行为。您可以使用Latch进行此操作。

没有数据库锁的线程现在仍然不会回滚。它将阻塞,直到数据库锁再次可用。您描述的方案与Optimistic concurrency control非常相似,所以可能已经实现了。