[SPRING] Grails 서비스에서 트랜잭션 롤백
SPRINGGrails 서비스에서 트랜잭션 롤백
RuntimeException이 서비스에 던져 질 때 Grail의 롤백 기능을 사용하여 트랜잭션이되도록 모든 서비스를 업데이트했습니다. 대부분의 경우이 작업을 수행합니다.
def domain = new Domain(field: field)
if (!domain.save()) {
throw new RuntimeException()
}
어쨌든, 나는 이것이 실제로 트랜잭션을 롤백 할 것인지를 확인하기를 원했고 ...이 시점에서 이미 커밋 되었는가에 대해 생각하게되었습니다. 또한 그렇지 않다면, 플러시를 설정합니다 : true change that? 나는 Spring / Hibernate가이 모든 것을 어떻게하는지 잘 모른다. :)
해결법
-
==============================
1.네, 그렇게 할거예요.
네, 그렇게 할거예요.
Grails의 트랜잭션은 기본적으로 서비스 메소드 레벨에서 처리됩니다. 메서드가 정상적으로 반환되면 트랜잭션이 커밋되고 RuntimeException이 throw되면 트랜잭션이 롤백됩니다.
이것은 서버 메소드에 객체를 저장하는 동안 flush : true를 사용하더라도 RuntimeException을 throw하면 db 변경 사항이 계속 롤백된다는 것을 의미합니다.
예 :
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") } } }
Grails에 대해 100 % 명확하지 않은 것은 확인 된 예외가 java / spring 세계에서 throw 된 경우 트랜잭션이 커밋 할 트랜잭션의 inceptor에 대한 기본 동작이며 구성에서 재정의 될 수 있습니다.
참고 : 경고가 있는데, 그것은 db가 업데이트중인 테이블에서 트랜잭션을 지원해야한다는 것입니다. 예, 이것은 MySQL에서 찌릅니다 :)
이는 Domain.withTransaction 메소드에도 적용됩니다.
-
==============================
2.허용 된 답변에 덧글을 추가하기를 원했는데 너무 길어서 덧글에 맞지 않았습니다.
허용 된 답변에 덧글을 추가하기를 원했는데 너무 길어서 덧글에 맞지 않았습니다.
기본적으로 예외를 검사하면 안됩니다. 그렇지 않으면 트랜잭션이 롤백되지 않습니다. 분명히 그것은 봄 것입니다.
메소드에서 예외를 실제로 확인하려면 서비스 메소드를 @Transactional로 명시 적으로 표시하고 rollbackFor 인수를 사용하여 롤백을 일으키는 예외를 나열하십시오. (실제로 이것을 테스트하지는 않았습니다.)
그러나 서비스에서 @Transactional을 사용하여 하나의 메소드를 표시하면 다른 메소드를 트랜잭션으로 자동 랩핑 할 수 없습니다. 그래서, 당신이 그것을 위해 그것을한다면, 당신은 그것 모두를 위해 그것을해야만합니다. 확인 된 예외를 반드시 선언해야합니다.
자세한 내용은 http://docs.grails.org/latest/guide/services.html에서 확인할 수 있습니다.
from https://stackoverflow.com/questions/2979786/rolling-back-a-transaction-in-a-grails-service by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] @EnableAsync와 동일한 스프링 XML (0) | 2019.04.17 |
---|---|
[SPRING] Spring에서 값을 가진리스트를 지정하는 가장 쉬운 방법은 무엇입니까? (0) | 2019.04.17 |
[SPRING] Java Spring Tomcat에서 응답이없는 웹 소켓을 어떻게 빨리 닫을 수 있습니까? (0) | 2019.04.16 |
[SPRING] 스프링을 사용하여 유레카 발견 클라이언트를 선택적으로 비활성화하는 방법은 무엇입니까? (0) | 2019.04.16 |
[SPRING] Spring 부트 @RepositoryRestResource를 특정 URL에 어떻게 맵핑 할 수 있습니까? (0) | 2019.04.16 |