2012-11-10 26 views
5

Giả sử tôi có một session bean mà thực hiện một phương thức giao dịch YÊU CẦU:EJB giao dịch với lời kêu gọi POJO

@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public void doTransaction() throws Exception { 
    try { 
     ... 
     // call to non-EJB bean object (not session, stateless or entity bean) 
    } catch (Exception e) { 
     context.setRollbackOnly(); 
     throw e; 
    } 
} 

Giả sử doTransaction() thay đổi trạng thái nội bộ của đối tượng không đậu, và thất bại. Liệu rollback khôi phục lại tình trạng ban đầu của phi đậu? Nếu không, cách thức được đề xuất để xử lý trường hợp này là gì? (hoặc là các cuộc gọi POJO trong một giao dịch không được phép?)

+0

Bạn có thể đưa ra ví dụ về pojo này không, đây có phải là biến lớp tĩnh không? Tôi có cảm giác bạn đang cố gắng làm điều gì đó có thể được thực hiện khác đi –

Trả lời

5

Các rollback rằng EJB tự động thực hiện sau khi ví dụ một ngoại lệ được ném, sẽ chỉ ảnh hưởng đến các tài nguyên đã tham gia giao dịch đang diễn ra (JTA).

Có một vài cách để tham gia vào một giao dịch đó. Cách hoàn thiện nhất là bằng cách triển khai giao diện XAResource và cho phép mã của bạn tranh thủ việc triển khai đó. Một cách đơn giản hơn nhưng ít tốn kém hơn là sử dụng Synchronizer.

Nói đúng ra, không phải người quản lý EJB container hoặc giao dịch tự rollbacks bất cứ điều gì. Thay vào đó, nó cung cấp cho các nguồn lực nhập ngũ một cơ hội để làm như vậy rollback. Vì vậy, nó sẽ không bao giờ tự nó có thể khôi phục lại các giá trị trước đó của các biến ngẫu nhiên xảy ra đã được sửa đổi trong một giao dịch.

Để hoàn tất, các tài nguyên mà thường (tự động) tham gia vào giao dịch là kết nối cơ sở dữ liệu (nếu chúng đến từ nguồn dữ liệu được quản lý container), thông báo JMS (một lần nữa, nếu đích được quản lý vùng chứa),) lưu trữ và các tài nguyên EIS dựa trên JCA.

0

JavaEE sẽ không lùi lại các thay đổi không phải là đậu. Điều duy nhất nó sẽ quay trở lại là các thực thể, nhưng chỉ sau khi đọc chúng một lần nữa từ DB.

Nếu bạn muốn điều đó loại ngữ nghĩa, bạn sẽ cần phải sử dụng một sản phẩm Software Transactional Memory.

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