Spring mvc 事务从未完成Neo4j
我有一个方法可以创建一个子图,它是这样定义的:Spring mvc 事务从未完成Neo4j,spring-mvc,neo4j,spring-data-neo4j,spring-transactions,Spring Mvc,Neo4j,Spring Data Neo4j,Spring Transactions,我有一个方法可以创建一个子图,它是这样定义的: @Transactional public Post createAndLink(Appuser appuser, Post post, String linkTo) { Post savedPost = null; if(post != null && appuser != null){ post.setCreatedBy(appuser); if(post.getId() ==
@Transactional
public Post createAndLink(Appuser appuser, Post post, String linkTo) {
Post savedPost = null;
if(post != null && appuser != null){
post.setCreatedBy(appuser);
if(post.getId() == null && post.getId() == ""){
post.setId("IND"+GenerateUUID.getUUID());
}
System.out.println(">>> Id created : "+post.getId());
//Date check
String d = post.getDate();
if(d != null && d.length() == 11 && ConversionUtils.isNumeric(d.substring(0, 4))
&& ConversionUtils.isNumeric(d.substring(5, 7)) && ConversionUtils.isNumeric(d.substring(8, 10))){
if(!ConversionUtils.isPastDate(d)){
System.out.println("Cannot save post with date after today");
return null;
}
}
System.out.println(">>> Date created : "+post.getDate());
//People check
Set<People> people = new HashSet<People>();
if(post.getPeople() != null){
for(People p : post.getPeople()){
People pFromDb = peopleService.findById(p.getId());
people.add(pFromDb != null ? pFromDb : new People("PPL"+GenerateUUID.getUUID(), p.getName()));
}
post.setPeople(people);
}
System.out.println(">>> People created : "+post.getPeople());
//Place check
if(post.getPlace() != null){
Place pFromDb = placeService.findById(post.getPlace().getId());
post.setPlace(pFromDb != null ? pFromDb : new Place(post.getPlace().getId()));
}
System.out.println(">>> Place created : "+post.getPlace());
System.out.println("Post checking OK.");
savedPost = repository.findById(linkTo);
if(savedPost != null){
Set<Post> linked = new HashSet<Post>();
linked.add(savedPost);
post.setLinkedPosts(linked);
}
template.save(post);
System.out.println("=====> [saveWithUser]: Saved OK!");
}
return savedPost;
}
PS:在阻塞之前的迭代,它显示正常的日志执行,但在数据库中没有创建任何内容
编辑2:
有时我会遇到这个错误(总是在第二次迭代期间,而第1次显示正常日志,但在DB上什么也不写):
我想我找到了问题(但还没有找到解决办法) 我从服务方法中删除了所有@Transactional注释(控制器和存储库未标记为Transactional) 在主帖子中描述的createAndLink方法中,我以这种方式添加了事务:
if(post != null && appuser != null){
Transaction tx = template.getGraphDatabaseService().beginTx();
//I kept the same code...
//...
tx.success();
tx.close();
}
现在,当我从控制器a调用这个方法时,tx是安慰剂类型。当我从控制器B调用它时,tx类型是顶级
我甚至做了一个测试,从控制器B调用控制器a方法(如下面的例子),它工作得很好(使用顶级Tx)。当我以相反的方式做时,Tx是安慰剂
控制器A:
@RequestMapping(value="/newandlinksimilar/{linkedTo}", method=RequestMethod.POST)
public @ResponseBody boolean createAndLinkNewSimilar(@RequestBody Post post, @PathVariable String linkedTo){
Post created = null;
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (post!= null && !(auth instanceof AnonymousAuthenticationToken)) {
AppuserDetails userDetails = (AppuserDetails)auth.getPrincipal();
Appuser currentUser = appuserService.findByLogin(userDetails.getUsername());
created = postService.createAndLinkSimilar(currentUser, post, linkedTo);
}
return created;
}
@autowired
private ControllerA controllerA;
@RequestMapping("/init")
public ModelAndView init(){
//I create a new Post object "post" with dummy data
controllerA.createAndLinkSimilar(post,"XXXXXX");
//Or postService.createAndLinkSimilar(appuser,post,"XXXXXX");
return new ModelAndView("home");
}
控制器B:
@RequestMapping(value="/newandlinksimilar/{linkedTo}", method=RequestMethod.POST)
public @ResponseBody boolean createAndLinkNewSimilar(@RequestBody Post post, @PathVariable String linkedTo){
Post created = null;
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (post!= null && !(auth instanceof AnonymousAuthenticationToken)) {
AppuserDetails userDetails = (AppuserDetails)auth.getPrincipal();
Appuser currentUser = appuserService.findByLogin(userDetails.getUsername());
created = postService.createAndLinkSimilar(currentUser, post, linkedTo);
}
return created;
}
@autowired
private ControllerA controllerA;
@RequestMapping("/init")
public ModelAndView init(){
//I create a new Post object "post" with dummy data
controllerA.createAndLinkSimilar(post,"XXXXXX");
//Or postService.createAndLinkSimilar(appuser,post,"XXXXXX");
return new ModelAndView("home");
}
这两个测试都是通过对控制器方法的GUI ajax调用进行的
我不明白Spring何时以及如何选择事务类型
它卡住了
意味着什么?例外(什么是stacktrace?)被阻止了?(在事务/数据库日志激活的情况下发布日志)很抱歉,不太清楚。这意味着没有任何进化,也没有例外(好像还在进行中)。请告诉我在哪里可以找到您提到的日志,以及如何激活该选项?大多数情况下,这些日志都可以在IDE的控制台中找到。如果不是,它们可能位于名为something.log的文件中。我不知道如何激活事务的特定日志,因为它取决于您的日志库。(log4j被广泛使用,并带有log4j.properties或log4j.xml来配置它)(对于neo4j:)谢谢。我将在激活日志的情况下进行复制,并将其发布到此处。我无法获得任何可读的日志。I'm lost:/n所有日志(messages.log除外)都已编码