Đúng là sẽ làm điều đó.
Giao dịch trong Grails theo mặc định được xử lý ở cấp Phương thức dịch vụ. Nếu phương thức trả về bình thường thì giao dịch sẽ được thực hiện, nếu một RuntimeException được ném, giao dịch sẽ được khôi phục.
Lưu ý điều này có nghĩa là ngay cả khi bạn sử dụng tuôn ra: đúng khi lưu đối tượng trong phương thức máy chủ, thay đổi db sẽ vẫn được khôi phục nếu bạn ném RuntimeException.
Ví dụ:
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")
}
}
}
gì Tôi không phải 100% rõ ràng về với Grails là những gì sẽ xảy ra nếu một ngoại lệ kiểm tra được ném trong java thẳng/mùa xuân thế giới vi mặc định là cho inceptor giao dịch cam kết các giao dịch, althrough này có thể được overriden trong cấu hình.
Lưu ý: có báo trước và đó là db của bạn phải hỗ trợ các giao dịch trên các bảng bạn đang cập nhật. Có, điều này là poke tại MySQL :)
Điều này cũng áp dụng cho phương pháp Domain.withTransaction
.
Nguồn
2010-06-05 14:29:07
Tuyệt vời, cảm ơn! – RyanLynch
vui mừng được phục vụ –
Ngoại lệ tùy chỉnh mở rộng RuntimeException phải OK, phải không? Ngoài ra, bạn có thể bật các giao dịch trong MySQL bằng cách cài đặt: phương ngữ = org.hibernate.dialect.MySQLInnoDBDialect trong dataSource :) – RyanLynch