[Grails] 프로그램 트랜잭션

8422 단어 Grails

참고 자료


6.6 절차적 거래
Interface TransactionStatus
Service 를 사용해 보십시오.

개요


Grails를 이용해 거래를 하려고 할 때Service 를 사용해 보십시오.와 같이 서비스라는 Grails의 기능을 활용해 할 수 있다.
실제로 서비스뿐만 아니라 프로그램 맥시크를 이용하여 이 스프링을 거래하는 메커니즘도 실현할 수 있다.
GORM이 확장되어 매우 간단합니다.

견본


예를 들어, 다음 도메인이 있는 경우
Hoge.groovy
class Hoge {

    String name
    static constraints = {
    }
}

토대


이 도메인의 거래를 실행하려면 다음 코드를 사용합니다.
HelloController
def index3() {
    Hoge.withTransaction { TransactionStatus status ->
        // 例えばINSERT
        def newHoge = new Hoge(name:"koji").save()
    }
    render "OK"
}
위 코드는 정상적인 INSERT가 됩니다.
단순히 하고 싶은 일을 도메인 복제로 건네주는 위드트랜스 액션이라는 방법일 뿐이다.
그럼 실제로 거꾸로 돌려보세요.

뒤집다


HelloController
def index3() {
    Hoge.withTransaction { TransactionStatus status ->
        // 例えばINSERT
        def newHoge = new Hoge(name:"koji").save()
        status.setRollbackOnly()
    }
    render "OK"
}
status.setRollbackOnly() 실행 후 이 거래(withTransaction 블록 내)의 데이터베이스 변경 사항은 모두 뒤집힙니다.

트랜잭션 범위


1건의 거래=withTransaction 블록이기 때문에 withTransaction 블록이 순환 중에 여러 번 운행되면 매번 거래가 다르다.
예를 들면 다음과 같은 경우.
withTransaction 블록을 10번 실행합니다.
HelloController
def index3() {
    (1..10) .each {Integer index ->
        Hoge.withTransaction { TransactionStatus status ->
            def newHoge = new Hoge(name:"koji-${index}").save()

            // INSERTした結果、IDが奇数の場合はロールバックする。
            if (newHoge.id % 2 != 0) {
                status.setRollbackOnly()
            }
        }
    }
    render "OK"
}
이렇게 하면 INSERT에서 데이터베이스로 이동할 때 ID가 홀수일 때 롤백됩니다.
실행 결과는 다음과 같습니다.

아주 간단하네요.

다른 도메인에 대한 업데이트도 유효합니다.


또 이번에는 Hoge 도메인 이름의 withTransaction, 이 Hoge를 사용했다.withTransaction 블록에서 다른 도메인 이름을 사용할 수도 있습니다.
예를 들어 다음 도메인 이름을 준비하면 Hoge의 ID가 홀수인 경우에도 반전을 시도합니다.
Piyo.groovy
class Piyo {

    String name
    static constraints = {
    }
}
다음 코드를 실행합니다.
HelloController.groovy
def index3() {
    (1..10) .each {Integer index ->
        Hoge.withTransaction { TransactionStatus status ->

            def newHoge = new Hoge(name:"Hoge-${index}").save()

            // Hogeドメインとは関係ないドメインのINSERT
            def newPiyo = new Piyo(name:"Piyo-${index}").save()

            // Hogeが奇数ならロールバック
            if (newHoge.id % 2 != 0) {
                status.setRollbackOnly()
            }
        }
    }
    render "OK"
}
실행 결과는 다음과 같습니다.

지난번 실행 결과가 남아있어 잘 보이지 않지만, 허지에 관해서는 보통과 마찬가지로 홀수가 뒤바뀌고 전혀 상관없는 피요 도메인도 뒤바뀌었다.

총결산


복잡한 처리 등은 서비스로 하는 것이 좋지만 런스스크립트가 실행하는 일괄 처리 등 간단한 처리 등이라면 매우 편리한 기능이라고 생각합니다.

좋은 웹페이지 즐겨찾기