mới Tôi đồng ý với câu trả lời bằng Kalpesh Soni
chỉ tôi muốn thêm chút nữa.
Vùng chứa sử dụng cùng một luồng để chạy một cho các cuộc gọi EJB khác. Một luồng có thể bị ràng buộc chỉ với một giao dịch toàn cầu được quản lý bởi TM. Đó là lý do tại sao @Asynchronous
cuộc gọi hạt không truyền bá giao dịch (thông số EJB 3.2, 4.5.3 Giao dịch). Giao dịch không thể được chia thành nhiều chủ đề hơn và nó bị ràng buộc với người gọi.
Nếu đậu được đánh dấu là CMT thì container quản lý tác phẩm giao dịch dựa trên chú thích hoặc thông tin được lấy từ mô tả ejb-jar.xml
. Container sau đó có thể quyết định nếu cuộc gọi phương thức đậu sẽ là một phần của giao dịch hiện đang chạy hoặc một giao dịch mới cần phải được tạo. Như đã đề cập giao dịch lồng nhau không được hỗ trợ trong hầu hết các thùng chứa Java EE. Theo hiểu biết của tôi, lý do chính là XAResource không hỗ trợ các giao dịch lồng nhau (xem JTA spec).
Đậu BMT sử dụng UserTransaction
để tự quản lý giao dịch. Làm thế nào tuyên truyền giao dịch hiện tại để BMT nên làm việc hoặc tốt hơn những gì bạn có thể với nó sau đó? Nếu bạn muốn bắt đầu giao dịch mới với UserTransaction.begin()
thì giao dịch hiện đang chạy sẽ bị tạm ngưng. Đó là cách tuyên truyền hiện tại hoạt động ngay bây giờ. Tôi có nghĩa là giao dịch không được tuyên truyền nhưng bị đình chỉ tại cuộc gọi đậu BMT. Một thứ khác mà bạn có thể làm là thúc đẩy giao dịch. Nó có nghĩa là sử dụng UserTransaction.commit()
hoặc UserTransaction.rollback()
khi giao dịch đến. Nếu bạn làm như vậy thì người gọi trả lại sẽ làm việc mà không có giao dịch đang hoạt động nào trong ngữ cảnh của nó.Có nghĩa là một cuộc gọi đến một bean khác có thể làm việc với giao dịch của bạn mà không có bạn như người gọi biết và được thông báo về nó. Tôi nghĩ rằng bạn không muốn điều này là có thể. Đó là sự hiểu biết của tôi về lý do đằng sau.
Có một điều thú vị nữa về BMT. Nếu bạn sử dụng SLSB (Bean Session Session) thì bạn không được phép thoát khỏi phương thức được gọi mà không hoàn thành giao dịch (xem EJB 3.2: 8.3.3 Enterprise Beans Using Bean-Managed Transaction Demarcation). Mặt khác SFSB (Session Session stateful) có thể thoát khỏi một phương thức mà không hoàn thành giao dịch và có thể kết thúc trong cuộc gọi khác. Nếu cuộc gọi như vậy xảy ra, ví dụ: trong phiên HTTP khác với giao dịch bị tạm ngưng và được lấy từ chuỗi hiện tại và sau đó được kích hoạt và được ghim vào chuỗi mới.
javax/giao dịch/xa/XAResource.html "XAResource Java EE 7 API"
An dự đoán có giáo dục: Một lý do có thể là tránh rò rỉ tài nguyên trong vùng chứa. Đó là một nguyên tắc hay khi một lớp tạo tài nguyên cũng phải chịu trách nhiệm làm sạch tài nguyên; và nếu điều đó xảy ra rằng nó không dọn sạch đúng cách sau khi thoát, vùng chứa có thể buộc đóng tất cả các tài nguyên mở do EJB mở (ví dụ: giao dịch mở) để tránh rò rỉ tài nguyên, điều này sẽ nguy hiểm. Một ví dụ liên quan là các bộ mô tả tập tin mở của các tiến trình trong * nix, tất cả sẽ được đóng bởi hạt nhân khi quá trình thoát. –