2011-12-13 11 views
13

Khi phương thức (giao dịch) của EJB gọi phương thức khác (giao dịch) của EJB khác và ngoại lệ được ném vào thứ hai, nhưng bị bắt trong trường hợp thứ nhất, có vẻ như giao dịch tự động quay trở lại khi thứ hai trở lại, ngay cả khi người đầu tiên bắt nó, điều này có đúng không? làm thế nào tôi có thể tránh nó?EJB: Tránh quay lại giao dịch

Kịch bản là một sau:

@Stateless 
class ClassA { 
    @EJB 
    ClassB objectB; 

    methodA() { 
     try { 
      objectB.methodB(); 
     } 
     catch(Exception e) { 
      //Here the transaction started in this method is 
      //automatically rolled back. Is this avoidable? 
     } 
    } 
} 

@Stateless 
class ClassB { 
    methodB() throws Exception { throw new Exception() } 
} 

Trả lời

19

giao dịch được cuộn lại trong trường hợp bạn ném một hoặc bất kỳ ngoại lệ RuntimeException@ApplicationException chú thích với rollback thuộc tính thiết lập để true, vì vậy:

@ApplicationException(rollback=true) 
public class MyException extends Exception { 
    // ... 
} 

sẽ rollback giao dịch vãng lai.

Theo mặc định ApplicationException không khôi phục giao dịch của bạn.

Nếu bạn không muốn methodB quay lại giao dịch, bạn có thể thay đổi hành vi khôi phục của ApplicationException hoặc ngăn chia sẻ giao dịch.

Cách thứ hai có thể đạt được bằng cách thay đổi TransactionAttribute của phương pháp B tức là thành RequiresNew. Sau đó, giao thức methodA (Tx1) sẽ bị đình chỉ và trong trường hợp methodB ném một ngoại lệ dẫn đến việc quay lại giao dịch của nó (Tx2), bạn vẫn có thể bắt nó trong phương thứcA và ngăn khôi phục giao dịch methodA (Tx1) của bạn.

8

Vâng, đó là sự thật, nếu ngoại lệ là một ngoại lệ thời gian chạy. Các ngoại lệ được kiểm tra không gây ra một cuộn ngược giao dịch.

Để tránh điều đó, chỉ cần đảm bảo rằng mã trong methodB không ném bất kỳ ngoại lệ thời gian chạy nào. Một ngoại lệ thời gian chạy thường chỉ ra một lỗi, hoặc một trạng thái không cho phép tiếp tục công việc.

+0

Rất tiếc, tôi đã sửa đổi câu hỏi cần lưu ý rằng nó đang ném ngoại lệ đã kiểm tra, giao dịch có được quay lại trong trường hợp này không? – edutesoy

+1

Không, không nên quay lại nếu ngoại lệ là ngoại lệ được kiểm tra. –

+1

Nếu tất cả những gì bạn biết là ngoại lệ được kiểm tra, bạn không thể nói nếu nó sẽ hoặc sẽ không quay trở lại giao dịch của bạn. Nếu đó là '@ApplicationException (rollback = true)', nó có thể khôi phục lại giao dịch của bạn. –