2014-04-20 2 views
2

동시에 업데이트해야하는 도메인 클래스가 있어야하며 둘 다 변경하거나 모두 변경하지 못하도록 트랜잭션을 사용하고 싶습니다. 예를 들어 :Grails 트랜잭션을 사용하여 두 개의 다른 도메인 객체를 한 번에 저장할 때

나는 두 개의 서로 다른 도메인 클래스 (사용자 및 추가)

User currentUser =.. 
User targetUser = .. 
Follow followUser = .. 

targetUser.follower = targetUser.follower + 1 
currentUser.follow = currentUser.follow + 1 
targetUser.save(flush:true) 
currentUser.save(flush:true) 
followUser.save(flush:true) 

나는이 모두가 함께 일 할이 있거나 하나가 실패 할 경우 중 어느 것도 발생하지 롤백됩니다. 내가 grails에서 이것을 어떻게 할 수 있습니까? DomainObject.withTransaction을 보았지만 두 개의 다른 도메인이 있으므로 중첩해야합니까?

답변

3

적절한 해결 방법은이 트랜잭션 코드를 서비스로 옮기는 것입니다. documentation은 컨트롤러에서 서비스를 만들고 사용하는 방법에 대해 간략하게 설명합니다. 그것이 적절한 해결책입니다.

그러나 이것이 유일한 방법은 아닙니다. 보시다시피 withTransaction을 사용하여 트랜잭션 범위 내에서 코드를 실행할 수 있습니다. (직접 documentation)에서 예를 들어

Account.withTransaction { status -> 
    def source = Account.get(params.from) 
    def dest = Account.get(params.to) 

    int amount = params.amount.toInteger() 
    if (source.active) { 
     source.balance -= amount 

     if (dest.active) { 
      dest.amount += amount 
     } 
     else { 
      status.setRollbackOnly() 
     } 
    } 
} 

는 withTransaction 클로져 내의 코드 도메인 클래스의 수에 걸쳐있다. 보시다시피 믹스 앤 매치가 가능합니다.

다시 말해서 스트레스를받습니다. 적절한 방법은 서비스를 사용하는 것입니다.