Tôi có một bộ gồm @Service
các hạt kế thừa chức năng cốt lõi từ một lớp trừu tượng. Tôi đã đánh dấu từng dịch vụ cấp dưới cụ thể bằng @Service
và @Transactional
. Lớp siêu trừu tượng chứa phương thức điểm vào công khai cho từng dịch vụ này. Nói cách khác, tôi có một cái gì đó tương tự như sau:Quy tắc thừa kế Spring @Transactional
abstract class AbstractService {
public void process() {
// Do common initialisation code here
processSpecific();
// Do common completion code here
}
abstract protected void processSpecific();
}
@Service @Transactional
public class FirstSpecificService extends AbstractService {
protected void processSpecific() {
// Do specific processing code here
}
}
@Service @Transactional
public class SecondSpecificService extends AbstractService {
protected void processSpecific() {
// Do different specific processing code here
}
}
Các mã cụ thể trong mỗi dịch vụ sub-class bê tông làm cho nhiều cuộc gọi đến các lớp DAO để thay đổi cơ sở dữ liệu, trong đó có REQUIRED
như công tác tuyên truyền giao dịch kiểu. Bây giờ với các dịch vụ được xác định như trên, tôi phát hiện ra rằng không có giao dịch hiện tại bên trong bất kỳ mã nào của các dịch vụ phụ lớp bê tông này, và mỗi cuộc gọi đến lớp DAO đã tạo một giao dịch mới, thực hiện các thay đổi, cam kết giao dịch và trả lại.
Tuy nhiên, nếu tôi chú thích các siêu lớp trừu tượng với @Transactional
, sau đó một giao dịch là tạo đúng cách, và các tiểu cuộc gọi đến các lớp DAO tất cả tham gia vào các giao dịch vãng lai.
Vì vậy, câu hỏi của tôi là, các quy tắc để kế thừa hành vi @Transactional
là gì? Tại sao Spring không sử dụng @Transactional
trên các dịch vụ phụ cấp cụ thể mà nó thực sự khởi tạo? Liệu các @Transactional
cần phải được trên siêu hạng trong trường hợp này bởi vì đó là nơi mà các phương pháp nhập điểm công cộng là?
Nhân tiện, tôi đã xem [tài liệu SpringSource có liên quan] (http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/htmlsingle/spring-framework -reference.html # transaction-declarative-annotations), nhưng điều đó dường như không bao gồm điều này. – DuncanKinnear