Trong ứng dụng Grails, hành vi mặc định của các phương thức dịch vụ là giao dịch và giao dịch được tự động khôi phục nếu một ngoại lệ không được kiểm tra được ném. Tuy nhiên, trong Groovy một không bắt buộc phải xử lý (hoặc rethrow) kiểm tra ngoại lệ, do đó, có một nguy cơ rằng nếu một phương pháp dịch vụ ném một ngoại lệ kiểm tra, giao dịch sẽ không được quay trở lại. Trên tài khoản này, có vẻ như nên chú thích mỗi lớp dịch vụ GrailsHành vi giao dịch dịch vụ Grails
@Transactional(rollbackFor = Throwable.class)
class MyService {
void writeSomething() {
}
}
Giả sử tôi có các phương pháp khác trong MyService
, một trong số đó chỉ đọc DB, còn người kia thì không chạm vào DB, như sau chú thích chính xác?
@Transactional(readOnly = true)
void readSomething() {}
// Maybe this should be propagation = Propagation.NOT_SUPPORTED instead?
@Transactional(propagation = Propagation.SUPPORTS)
void dontReadOrWrite() {}
Để trả lời câu hỏi này, tôi đoán bạn sẽ cần phải biết những gì ý định của tôi là:
- Nếu một ngoại lệ được ném từ phương pháp nào và có một giao dịch cơ bản dở dang, nó sẽ được cuộn lại. Ví dụ: nếu
writeSomething()
gọidontReadOrWrite()
và một ngoại lệ được ném từ thứ hai, giao dịch được khởi động trước đó sẽ được khôi phục. Tôi giả sử rằng thuộc tính cấp lớprollbackFor
được thừa hưởng bởi các phương thức riêng biệt trừ khi chúng ghi đè lên nó một cách rõ ràng. - Nếu không có giao dịch đang diễn ra, một giao dịch sẽ không được bắt đầu cho các phương thức như
dontReadOrWrite
- Nếu không có giao dịch nào được thực hiện, thì giao dịch chỉ đọc sẽ được bắt đầu. Nếu một giao dịch đọc-ghi đang được tiến hành, nó sẽ tham gia vào giao dịch này.