2010-06-05 3 views
12

서비스에 RuntimeException이 발생했을 때 Grail의 롤백 기능을 사용하여 모든 서비스를 트랜잭션 방식으로 업데이트했습니다. 나는 대부분의 경우,이 일을 한 : 어쨌든Grails 서비스에서 트랜잭션 롤백

def domain = new Domain(field: field) 
if (!domain.save()) { 
    throw new RuntimeException() 
} 

을, 나는 이것이 참으로 트랜잭션을 롤백하는지 확인하고 싶었 ... 또한 .. 내가 이미 최선을 다하고있어이 시점에서 여부에 관한 생각을 가지고 , 그렇지 않다면, 홍조를 정할 것입니다 : 참된 변화? 나는 봄/최대 절전 모드가이 모든 것을하는 방법에 익숙하지 않다. :)

답변

15

그래도 될 것이다.

Grails의 트랜잭션은 기본적으로 서비스 메소드 수준에서 처리됩니다. 메서드가 정상적으로 반환되면 트랜잭션이 커밋되고 RuntimeException이 throw되면 트랜잭션이 롤백됩니다.

서버 메서드에 객체를 저장하는 동안 flush : true를 사용하더라도 RuntimeException을 throw하면 db 변경 사항이 계속 롤백됩니다. 예를 들어

는 : 트랜잭션 inceptor 확정에 대한 확인 예외가 바로 자바에 던져 경우 발생하는 것입니다 Grails의과에 나는 100 % 명확하지 않다 무엇

class MyService { 

def fiddle(id,id2){ 
    def domain = Domain.findById(id) 

    domain.stuff = "A change" 
    domain.save(flush:true) // will cause hibernate to perform the update statements 

    def otherDomain = OtherDomain.findById(id2)  

    otherDomain.name = "Fiddled" 

    if(!otherDomain.save(flush:true)){ // will also write to the db 
    // the transaction will be roled back 
    throw new RuntimeException("Panic what the hell happened") 
    }               
} 
} 

/봄 세계의 기본 동작은 이 트랜잭션은 구성에서 재정의 될 수 있습니다.

참고 :주의 할 점은 db가 업데이트중인 테이블에서 트랜잭션을 지원해야한다는 것입니다. 예, 이것은 MySQL에서 찌르다 :)

이것은 Domain.withTransaction 메소드에도 적용됩니다.

+0

굉장합니다, 감사합니다! – RyanLynch

+0

기꺼이 서비스 –

+0

RuntimeException을 확장하는 사용자 정의 예외는 정상적으로 처리되어야합니다. 또한 MySQL에서 트랜잭션을 활성화하려면 dialect = org.hibernate.dialect를 설정하면됩니다.데이터 소스의 MySQLInnoDBDialect :) – RyanLynch

2

허용 된 답변에 덧글을 추가하기를 원했고, 너무 길어서 메모에 맞지 않았습니다. 내가 Grails를 가진 100 % 명확하지 않다 무엇

는 체크 예외가 기본적으로

는, 예외가 확인되어서는 안 슬로우되는, 또는 트랜잭션이 롤백하지 않을 경우 발생하는 것입니다 뒤로. 분명히 그것은 봄 것입니다.

메서드에 대한 예외를 실제로 확인하려면 서비스 메서드를 @Transactional으로 명시 적으로 지정하고인수를 사용하여 롤백을 일으키는 예외를 나열 할 수 있습니다.

@Transactional을 사용하는 서비스의 모든 메서드를 표시하면 트랜잭션을 사용하여 다른 메서드를 자동으로 래핑 할 수 없으므로주의해야합니다. 그래서, 만일 당신이 그것을 위해 그것을하면, 그들 모두를 위해 그것을해야한다. 확인 된 예외를 선언하려면 실제로 이 필요합니다.)

자세한 내용은 http://docs.grails.org/latest/guide/services.html에서 확인할 수 있습니다.

관련 문제