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

标签 java multithreading spring junit transactional

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

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

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

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

这可能吗?

最佳答案

第一个问题是事务上下文绑定(bind)到一个线程(具有本地线程)。因此,您必须在每个线程中启动一个事务。 (我认为 Spring 不支持此操作。您可以使用 transaction manager 以编程方式启动事务。)

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

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

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

关于java - 测试对事务服务的同时调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1715182/

相关文章:

java - 如何实现JMF

python - 如何停止 dbus gobject 循环

c++ - 使用 InterlockedCompareExchange 无锁

java - 在两个 SQLSessionFactory bean 之一上使用 @Primary 时出现 "java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist"

Java, Spring : Finding objects within a given time-frame not working after adding time-zone to java. sql.Timestamp

java - 水果射击游戏试图结束

java - 将数据从 select 标签发送到 servlet

c++ - 我可以在不同的方法中使用相同的互斥量吗?

java - 如何在没有 Spring Boot 的情况下使用 JPA 存储库

java - 为什么heroku构建由于gradle和spring boot而失败?