2013-07-27 43 views
5

Một câu nói từ EJB 3.1 specification:Tại sao hạt EJB với các giao dịch được quản lý bằng bean hoạt động như một "rào cản giao dịch"?

13.6.1 Bean-Managed Phân định giao dịch

Các thùng chứa phải quản lý lời gọi khách hàng để doanh nghiệp đậu dụ với ranh giới giao dịch đậu được quản lý như sau. Khi ứng dụng khách gọi phương thức kinh doanh qua một trong các chế độ xem của khách hàng của doanh nghiệp, vùng chứa sẽ tạm ngưng bất kỳ giao dịch nào có thể là được liên kết với yêu cầu của khách hàng.

Mặt khác, một giao dịch từ một khách hàng độc lập hoặc EJB khác được truyền vào một bean sử dụng giao dịch container quản lý. Nhìn vào nó từ góc độ CMT, có vẻ như các hạt cà phê sử dụng CMT có một tính năng quan trọng bổ sung (tuyên truyền giao dịch).

Lý do cho hạn chế này ("rào cản giao dịch") được áp dụng đối với đậu sử dụng BMT là gì?

câu hỏi liên quan:

+0

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. –

Trả lời

-1

Khi bạn sử dụng BMT, bạn quản lý các giao dịch. Bạn sử dụng UserTransaction để tạo và cam kết giao dịch.

Điểm ở đây là UserTransaction tạo giao dịch trong luồng hiện tại và khi bạn gọi EJB khác, cuộc gọi đó sẽ được thực hiện trong một chuỗi khác (với vòng đời của EJB riêng).

Trong CMT, vùng chứa xen vào lời gọi phương thức để xử lý giao dịch.

3.1 UserTransaction Interface (Từ đặc điểm kỹ thuật JTA)

Phương pháp UserTransaction.begin bắt đầu một giao dịch toàn cầu và liên kết sau khi giao dịch với tiểu trình đang gọi. Liên kết giao dịch đến chủ đề được quản lý một cách minh bạch bởi Trình quản lý giao dịch.

Không cần hỗ trợ cho các giao dịch lồng nhau. Phương thức UserTransaction.begin ném NotSupportedException khi chuỗi cuộc gọi đã được liên kết với giao dịch và việc triển khai trình quản lý giao dịch không hỗ trợ các giao dịch lồng nhau .

3.2.2 Hoàn tất giao dịch

Các TransactionManager.phương thức cam kết hoàn tất giao dịch hiện được liên kết với chuỗi cuộc gọi. Sau khi phương thức cam kết trả về, chuỗi gọi không được liên kết với giao dịch. Nếu phương thức cam kết được gọi khi luồng không được liên kết với bất kỳ ngữ cảnh giao dịch nào, TM ném một ngoại lệ.

13.2.5 container-Managed phân định (Từ EJB đặc điểm kỹ thuật)

Bất cứ khi nào một khách hàng gọi một phương thức trên giao diện kinh doanh một đậu doanh nghiệp (hoặc trên quan điểm không có giao diện hoặc nhà hoặc giao diện thành phần của một bean doanh nghiệp), vùng chứa phân phối trên phương thức yêu cầu. Khoảng cách này cho phép vùng chứa kiểm soát phân giới cắm mốc giao dịch được khai báo thông qua thuộc tính giao dịch do nhà phát triển đặt.

+0

Khi một EJB sử dụng CMT gọi một EJB khác bằng CMT, thì nó cũng có chu kỳ sống riêng của nó. Vậy tại sao nó lại hoạt động trong trường hợp đó? Đối với "cuộc gọi đó sẽ được thực hiện trong một chuỗi khác": Bạn có thể chỉ ra phần có liên quan trong thông số kỹ thuật mà tại đó điều này được xác định không? Nói cách khác, nó thực sự là một chủ đề khác? Trong trường hợp EJB gọi EJB khác thì không có chủ đề AFAIK nào khác. – Beryllium

+0

Tôi đã cập nhật câu trả lời của mình với câu trả lời chi tiết hơn. Hãy cho tôi bây giờ bạn nghĩ gì về câu trả lời đó –

+0

Tôi cũng có vấn đề với xác nhận này "khi bạn gọi một EJB khác, cuộc gọi đó sẽ được thực thi trong một chuỗi khác" - Tôi không nghĩ đây là yêu cầu –

2

của tôi "đoán" sẽ là

chứa này "thấy" mà bạn đã đánh dấu sự đậu như BMT

như vậy tại một thời điểm nào bạn có lẽ sẽ sử dụng đối tượng UserTransaction và bắt đầu của nó/cam/rollback phương pháp vv

Và kể từ khi giao dịch thật sự lồng không được hỗ trợ bởi WebLogic/oracle vv .. container không có lựa chọn nào khác để đình chỉ giao dịch hiện tại để có thể hỗ trợ việc mới một

Trong trường hợp của CMT - kể từ khi bạn sử dụng Yêu cầu, hoặc RequiredNew - container "biết" ý định của bạn và choses để tiếp tục cùng một giao dịch, hoặc đình chỉ và bắt đầu một phù

0

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"

0

Tôi đã làm một tìm kiếm nhỏ về vấn đề này, điểm mấu chốt là -like gì @kalpesh Soni nói above- Container knows exactly what It's doing to propagate the transaction, but leaving it to you, It's expected that you might create a scenario that causes problems due to the details of the underlying server that you use direclty ... Trong this link, người viết mô tả một tình huống nhất định gây ra vấn đề cụ thể với weblogic + hành vi ứng dụng quái dị .... Ông cũng đánh giá cao chức năng này nhưng không có trong giao diện UserTransaction trực tiếp nhưng tại một trong các triển khai của nó