假设使用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示例的每一端回滚我的会议。