복붙노트

[SPRING] Grails 서비스에서 트랜잭션 롤백

SPRING

Grails 서비스에서 트랜잭션 롤백

RuntimeException이 서비스에 던져 질 때 Grail의 롤백 기능을 사용하여 트랜잭션이되도록 모든 서비스를 업데이트했습니다. 대부분의 경우이 작업을 수행합니다.

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

어쨌든, 나는 이것이 실제로 트랜잭션을 롤백 할 것인지를 확인하기를 원했고 ...이 시점에서 이미 커밋 되었는가에 대해 생각하게되었습니다. 또한 그렇지 않다면, 플러시를 설정합니다 : true change that? 나는 Spring / Hibernate가이 모든 것을 어떻게하는지 잘 모른다. :)

해결법

  1. ==============================

    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. ==============================

    2.허용 된 답변에 덧글을 추가하기를 원했는데 너무 길어서 덧글에 맞지 않았습니다.

    허용 된 답변에 덧글을 추가하기를 원했는데 너무 길어서 덧글에 맞지 않았습니다.

    기본적으로 예외를 검사하면 안됩니다. 그렇지 않으면 트랜잭션이 롤백되지 않습니다. 분명히 그것은 봄 것입니다.

    메소드에서 예외를 실제로 확인하려면 서비스 메소드를 @Transactional로 명시 적으로 표시하고 rollbackFor 인수를 사용하여 롤백을 일으키는 예외를 나열하십시오. (실제로 이것을 테스트하지는 않았습니다.)

    그러나 서비스에서 @Transactional을 사용하여 하나의 메소드를 표시하면 다른 메소드를 트랜잭션으로 자동 랩핑 할 수 없습니다. 그래서, 당신이 그것을 위해 그것을한다면, 당신은 그것 모두를 위해 그것을해야만합니다. 확인 된 예외를 반드시 선언해야합니다.

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

  3. from https://stackoverflow.com/questions/2979786/rolling-back-a-transaction-in-a-grails-service by cc-by-sa and MIT license