2

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

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

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

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

这甚至可能吗?

4

1 回答 1

4

第一个问题是事务上下文绑定到一个线程(线程本地)。所以你必须在你的每个线程中启动一个事务。(我认为春季不支持此功能。您可以使用事务管理器以编程方式启动事务。)

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

完成此设置后,您可以通过在一个线程拥有数据库锁时阻塞一个线程来测试该行为。您可以为此使用Latch 。

没有数据库锁的线程现在仍然不会回滚。它将阻塞,直到数据库锁再次可用。您描述的方案与乐观并发控制非常相似,因此也许这已经实现了。

于 2009-11-11T13:57:35.727 回答