Không. Cả hai đều không được proxy chặn, và tệ hơn là không có lỗi lúc biên dịch hay lúc khởi động — code chạy bình thường nhưng không hề có transaction.
private: proxy không thể override, mà lời gọi tới nó luôn là lời gọi nội bộ trong target nên không đi qua proxy.final(hoặc classfinal): CGLIB proxy là subclass của target, methodfinalkhông override được → advice không gắn vào được.
Quy tắc visibility hiện tại: @Transactional dùng cho method public; từ Spring Framework 6.0, method protected hoặc package-private cũng transactional được với class-based proxy. Với interface-based proxy thì method bắt buộc public và phải khai báo trong interface.
@Service
public class OrderService {
@Transactional
private void save(Order o) { } // never transactional
@Transactional
public final void submit(Order o) { } // final -> advice cannot be applied
}Cùng cơ chế đó giải thích vì sao gọi this.save(o) từ một method khác trong cùng class cũng mất transaction: chỉ lời gọi từ bên ngoài đi qua proxy mới được chặn. Cách xử lý: tách sang bean khác, hoặc chuyển sang AspectJ mode (weaving vào bytecode, không dùng proxy).
Muốn phát hiện sớm loại lỗi này thì bật cảnh báo của IDE/static analysis cho @Transactional trên method non-public, vì runtime im lặng hoàn toàn.