Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试对事务服务的同时调用_Java_Multithreading_Spring_Junit_Transactional - Fatal编程技术网

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

Java 测试对事务服务的同时调用,java,multithreading,spring,junit,transactional,Java,Multithreading,Spring,Junit,Transactional,我应该如何测试同时使用的事务性服务方法(它通过减少值来更新数据库行) 我已经用SpringJunit4ClassRunner设置了一个JUnit测试类,组件是@autowired的 仅仅产生调用该方法的线程似乎不起作用。我不确定这是否与Spring代理机制有关 我想要实现的是创建一种情况,即两个线程同时“在”测试方法中,而另一个线程将失败并回滚。e、 g.行值为3,两个方法调用都试图将该值减少2;如果该方法不起作用,则值为-1,这是非法的。但我希望这两个调用都失败并回滚,或者一个尝试在另一个之后

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

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

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

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


这可能吗?

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

您描述的代码:read、decrement、write仅适用于正确的隔离级别(序列化和可重复读取)

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


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

您应该准确地解释在生成线程时什么不起作用。我要么在可调用方法的一开始就遇到了nullpointer异常(它只是一个私有方法调用),要么hibernate异常表示该表不存在,这很奇怪,因为同一个调用在一个测试方法中没有线程正常工作。这听起来正是我想要的。我会试着看看我是否能把一切都做好。非常感谢。