2012-06-03 3 views
5

나는 Grails 서비스를 트랜잭션으로 표시하고 많은 일을한다.Grails 거래 문제

나는이 방법에 코드를 추가하고 나는 그것을 통해 단계 때 예상 결과를 얻고 있지 않다 :

  1. 나는 모든 방법이 완료 될 때까지 MySQL의 백엔드에서 볼 수없는 .save()를 호출하는 코드가 있습니다. 이것은 서비스 방법이 트랜잭션이라고 가정 할 때 나는 기대할 것입니다.
  2. .save()을 호출하는 다른 코드는 서비스 메소드가 완료되기 전에 MySQL에서 볼 수 있습니다. 나는 이것을 이해하지 못하며 이것과 1의 불일치를 이해하지 못한다.
  3. groovy.sql.Sql을 사용하여 데이터베이스에 삽입하는 코드가 더있다. Grails의 트랜잭션 처리 외부에있는 것으로 추측됩니다. 따라서이 메소드가 끝나기 전에 커밋되는 것이 합리적입니다. Grails가 트랜잭션 내부에서이를 관리하도록 할 수 있습니까?

제 생각에는 오류가 있습니다. 여기에 몇 가지 관련 코드는 다음과 같습니다

홈페이지 서비스 방법

public void updateDb(Date date) { 
     // Create the results 
     if (createResults() > 0) { 
      createA() 
      createB() 
     } 
} 

createA

A a = new a() 
a.user = user 
a.week = week 
a.save() 

createB

userWeek = new UserWeek(user: user) 
userWeek.number = 1 
userWeek.save(flush: true) 

createResults

String insert = "insert into ..." 
Sql sql = new Sql(dataSource) 
sql.execute(insert) 

나는 그것을 세척 할 flush:true을 추가,하지만 지금은 트랜잭션이기 때문에 단지 플러시 최대 절전에 실제로 트랜잭션을 커밋하지 않는 것이 이해합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

게시하는 코드에서 어떤 일이 일어나고 있는지 명확하지 않으며, 또한 당신이 규칙을 위반하고있는 것처럼 보입니다. 하나의 트랜잭션 컨텍스트 (grails 메소드 호출)에서 의도적으로 트랜잭션을 중단하려고 시도하고 있습니까? 또한 플러시를 강제하는 이유는 무엇입니까? –

+0

@HansWesterbeek 나는 어떤 거래에서 벗어나려고 노력하지 않고 있었다. 나는 상속 된 코드를보고있다. 나는 시험으로 플러시를 강요했기 때문에 (나는 그 때 그것을 이해하지 못했기 때문에) 나는 그것을 제거 할 계획이다.(트랜잭션 외부에서 작동하는 현재'createResults' 메소드를 제외하고) 전체 트랜잭션이 커밋 될 때까지 커밋해야합니다. – skaz

답변

7

당신이 얻을 수있는 groovy.sql.Sql 서비스 방법 대신 Sql constructor that takes a connection argument를 사용하여 사용하는 트랜잭션에서 실행 :

  Sql sql = new Sql(sessionFactory.currentSession.connection()) 

이 데이터의 문제를 해결해야한다는 동일한 서비스 방법에서 서로 다른 시간에 최선을 다하고지고.

+0

감사합니다 - 이것은 분명히 내 문제의 일부를 해결할 것입니다! – skaz

0

비슷한 상황이었습니다. 저를 위해 해결 된 것은 refresh() - 메서드를 호출하는 것입니다. 나는 또한 플러시를 시도 : 진실과 다른 것들이 있지만 아무것도 작동했습니다.

새로 고침 here에 대해 읽을 수 있습니다.