【问题标题】:Testing simultaneous calls to transactional service测试对事务服务的同时调用
【发布时间】:2010-12-15 11:17:16
【问题描述】:

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

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

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

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

这可能吗?

【问题讨论】:

  • 您应该准确解释在产生线程时什么不起作用。
  • 我要么在可调用方法的一开始就遇到空指针异常(它只是一个私有方法调用),要么是休眠异常,说该表不存在,这很奇怪,因为同一个调用在没有线程正常工作的测试方法中。

标签: java multithreading spring junit transactional


【解决方案1】:

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

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

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

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

【讨论】:

  • 这听起来很符合我的要求。我会试着看看我是否让一切正常。谢谢!
猜你喜欢
  • 2011-11-01
  • 1970-01-01
  • 2017-02-03
  • 2020-07-16
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多