2017-02-16 3 views
1

롤백 롤백하지 않습니다Grails의 (2.3) @Transactional 여기에 완료

@Transactional(propagation = Propagation.REQUIRES_NEW) 
def test2() { 
    def dummy = new Dummy(name: "test2") 
    dummy.save() 
    try { 
    throw new RuntimeException("test2!") 
    } catch (all) { 
    println all.message 
    } 
} 

답변

1
: 여기

@Transactional(propagation = Propagation.REQUIRES_NEW) 
def test1() { 
    def dummy = new Dummy(name: "test1") 
    dummy.save() 
    throw new RuntimeException("test1!") 
} 

하지만하지 - - 아마 잘못되는 시도/캐치 동작에 영향을주지해야한다

어쩌면 당신은 시도 캐치의 목적을 오해 또는 어쩌면 당신은 흔들 거리는 순간 데 :

@Transactional(propagation = Propagation.REQUIRES_NEW) 
def test2() { 
    //you may be doing other stuff here 
    //but now about to do some transaction work 
    //so lets wrap this method around a try catch 
    try { 
    //this is happening 
    def dummy = new Dummy(name: "test2") 
    dummy.save()  
    } catch (Exception all) { // or catch (Throwable all) { 
    // if something went wrong in above save method 
    //should be caught and runtime exception means roll back 
    throw new RuntimeException("test2!" +all?.toString()) 
    } 
} 

내가 희망을 어디서 잘못되었는지 설명하지만 실제로이 모든 것을 서비스에서 수행하고 컨트롤러에서 catch 부분을 잡으려고합니다. -

트랜잭션 작업을 수행하고 문제가 발생하면 컨트롤러에서 try catch가 캡처하여 롤백하도록 설정할 서비스.

I did a sample project years back here 그것이

그 사람의 실험을하고 정말 적절한 코딩을하고 가겠어요 길없는 eitherway 도움이되기를 바랍니다, 나는 일을 오히려 이상한 특이한 방법으로 의미 짧은에서 그는 단지입니다 런타임 예외를 발생 시키므로 롤백을 유발합니다. 나는 당신이 컨트롤러에서 잡으려고 시도하는 대답을 원한다는 대답에 나의 제안을 고수한다. 이는 주어진 서비스 트랜잭션 작업의 실패 내에서의 실패뿐만 아니라 현재의 객체의 유효성 검증 오류를 포착하려고 시도합니다. Something like this하지만 모든 특정 문제를 캡처하고 근본적인 문제가있는 원래 페이지로 돌아가는 작업이 더 많아졌습니다. 이제는 트랜잭션을 롤백했습니다.

+0

어쨌든 프록시에서 예외를 인식 할 것으로 기대하고 있습니다. 테스트 2 : http://devhobbs.blogspot.de/2015/04/grailsgorm-transactions.html (테스트 2 결과 : 기록이 작성되지 않았습니다. 예외가 롤백됩니다.) –

+0

서비스를 시작하기 만하면됩니까? '@Transactional (propagation = Propagation.REQUIRES_NEW) def test1() {'은 (는) 서비스 중이십니까[email protected] BookService {' – Vahid

+0

예제에 대한 내 코멘트가 너무 길어서 업데이트 된 답변을 확인한 이후에 내 answe를 업데이트했습니다. – Vahid

2

기본적으로 @Transactional은 체크되지 않은 예외 (즉, RuntimeException)가 트랜잭션을 롤백하도록하는 방법을 래핑합니다.

메서드 내에서 예외를 catch/처리하는 경우 예외는 트랜잭션 래퍼로 전파되지 않으며 트랜잭션은 롤백 전용으로 표시되지 않습니다. 이것은 당신이하고있는 것처럼 보입니다.

다른 예외가 발생하고 래퍼로 전파되는 경우 트랜잭션 래퍼가 트랜잭션을 롤백해야 함을 나타낼 수 있음을 지적 할 가치가 있습니다. 주석은 rollbackFor 주석 매개 변수를 사용하여 수행 할 수 있습니다. 예를 들어

,

@Transactional(rollbackFor=Throwable.class) 
void doTransactionalWork() throws MyException { ... } 

트랜잭션의 원인이됩니다 어떤의 Throwable도 그 선택되어 있는지, 래퍼까지 전파 경우 롤백을 (즉., MyException)

이 있어야 새 트랜잭션을 만들거나 기존 트랜잭션 컨텍스트를 상속하는지 여부에 관계없이 모든 @Transactional 메서드의 동작.