2012-05-02 34 views
29

Tôi có một phương pháp như sau:Làm thế nào để sử dụng giao dịch mùa xuân trong multithread

ClassA.java 
@Transactional 
public void methodA(){   
    ExecutorService executorService = Executors.newFixedThreadPool(4); 
    executorService.execute(new Runnable() { 
     public void run() { 
      classB.methodB(); 
     } 
}); 
} 
ClassB.java 
@Transactional 
public void methodB(){ 
    updateDB(); 
} 

các methodB có thể làm việc tốt? Theo hiểu biết của tôi, methodB sẽ đính kèm giao dịch của methodA, nếu methodA thoát trước methodB thì sao? Tôi đoán phương pháp duy nhấtA có thể được giao dịch. Nhưng methodB sẽ không cam kết vì giao dịch đã cam kết trước đó.

Tôi có thể sử dụng @Transactional (propagation = Propagation.REQUIRES_NEW) cho phương thức B không. Điều này có thể cho phép methodB có một giao dịch mới. Nhưng theo tài liệu mùa xuân, việc chuyển giao phương thứcA sẽ tạm dừng khi nó gọi methodB. Tôi cảm thấy rất bối rối ở đây.

Có ai có thể giúp tôi về vấn đề này không? Cảm ơn trước.

+0

chính xác bạn muốn nó làm gì? –

Trả lời

23

Không, methodB() sẽ không được thực hiện trong cùng một giao dịch như methodA(). Spring's @Transactional chỉ hoạt động trên một chuỗi đơn - nó tạo ra một phiên khi một sợi đầu tiên nhập một phương thức với @Transactional (hoặc một phương thức trong một lớp học với @Transactional), và sau đó cam kết nó khi nó rời khỏi phương thức đó.

Trong ví dụ của bạn, giao dịch sẽ kết thúc sau khi bạn lên lịch công việc trong nhóm chủ đề. methodB() sẽ có giao dịch riêng.

+0

Bạn có thể tư vấn cách giám sát nếu chúng không phải là giao dịch giống nhau không? Những gì tôi thấy là giao dịch không được cam kết. – Jacky

+0

@Jacky Giao dịch nào trong hai giao dịch không thực hiện? – jmruc

+0

Giao dịch của phương thức B không cam kết. – Jacky

Các vấn đề liên quan