很难用事务支持编写多线程集成测试

时间:2014-06-10 16:16:55

标签: java multithreading scala transactions specs2

假设使用Specs2进行此规范/测试:(这个概念在Java中可能类似,所以我也将帖子标记为Java)

"Given there are 2 meetings stored, when I retrieve all stored meetings, I should see 2 meetings" {
    createMeeting1()
    createMeeting2()

    val retrievedMeetings = Await.result(meetingQuery.all, Duration(10, TimeUnit.SECONDS)) 
    retrieveMeetings must haveSize(2)
} 

all方法定义是:

def all = Future[List[Meetings]] {
     // Returns the future while executing the DB request
}

问题是结果不是2而是0 实际上,我注意到创建和检索不会发生在同一个事务中(因为一个Spring事务是由Specs2示例创建的,特别是每个线程)。

更确切地说,由检索线程管理的阅读事务无法查看创建的会议,因为那些属于Spec事务(在spec方法上使用@Transactional)并且尚未提交。
当然,检索说:"没有会议!"

我该如何处理这个案子?
我认为创建和检索共享相同的事务,即使我应该在我的Specs2类中取消@Transactional并手动处理它们。

我最初应该创建一个Future,管理会议创建,然后将其与检索链接起来,整个在同一个线程中吗? 如果这种机制是可能的,可以有人发布一个例子吗?

当然,当我不使用任何多线程(没有Future)时,整个工作正常。

注意:我在主流程中使用了一个事务,因为我想在Specs2示例的每一端回滚我的会议。

0 个答案:

没有答案