그래도 될 것이다.
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
메소드에도 적용됩니다.
굉장합니다, 감사합니다! – RyanLynch
기꺼이 서비스 –
RuntimeException을 확장하는 사용자 정의 예외는 정상적으로 처리되어야합니다. 또한 MySQL에서 트랜잭션을 활성화하려면 dialect = org.hibernate.dialect를 설정하면됩니다.데이터 소스의 MySQLInnoDBDialect :) – RyanLynch