나는 Grails 서비스를 트랜잭션으로 표시하고 많은 일을한다.Grails 거래 문제
나는이 방법에 코드를 추가하고 나는 그것을 통해 단계 때 예상 결과를 얻고 있지 않다 :
- 나는 모든 방법이 완료 될 때까지 MySQL의 백엔드에서 볼 수없는
.save()
를 호출하는 코드가 있습니다. 이것은 서비스 방법이 트랜잭션이라고 가정 할 때 나는 기대할 것입니다. .save()
을 호출하는 다른 코드는 서비스 메소드가 완료되기 전에 MySQL에서 볼 수 있습니다. 나는 이것을 이해하지 못하며 이것과 1의 불일치를 이해하지 못한다.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
을 추가,하지만 지금은 트랜잭션이기 때문에 단지 플러시 최대 절전에 실제로 트랜잭션을 커밋하지 않는 것이 이해합니다. 내가 도대체 뭘 잘못하고있는 겁니까?
게시하는 코드에서 어떤 일이 일어나고 있는지 명확하지 않으며, 또한 당신이 규칙을 위반하고있는 것처럼 보입니다. 하나의 트랜잭션 컨텍스트 (grails 메소드 호출)에서 의도적으로 트랜잭션을 중단하려고 시도하고 있습니까? 또한 플러시를 강제하는 이유는 무엇입니까? –
@HansWesterbeek 나는 어떤 거래에서 벗어나려고 노력하지 않고 있었다. 나는 상속 된 코드를보고있다. 나는 시험으로 플러시를 강요했기 때문에 (나는 그 때 그것을 이해하지 못했기 때문에) 나는 그것을 제거 할 계획이다.(트랜잭션 외부에서 작동하는 현재'createResults' 메소드를 제외하고) 전체 트랜잭션이 커밋 될 때까지 커밋해야합니다. – skaz