EJB - Giao dịch
Một giao dịch là một đơn vị công việc đơn lẻ, tuân theo các thuộc tính ACID. ACID là viết tắt của Nguyên tử, Nhất quán, Cô lập và Bền.
Atomic- Nếu hạng mục công trình nào không đạt thì coi như toàn bộ không đạt. Thành công có nghĩa là, tất cả các mục thực hiện thành công.
Consistent - Một giao dịch phải giữ cho hệ thống ở trạng thái nhất quán.
Isolated - Mỗi giao dịch thực hiện độc lập với bất kỳ giao dịch nào khác.
Durable - Giao dịch phải tồn tại sau lỗi hệ thống nếu nó đã được thực hiện hoặc được cam kết.
EJB Container / Servers là các máy chủ giao dịch và xử lý việc truyền ngữ cảnh giao dịch và các giao dịch phân tán. Các giao dịch có thể được quản lý bởi vùng chứa hoặc bằng cách xử lý mã tùy chỉnh trong mã của bean.
Container Managed Transactions - Trong loại này, vùng chứa quản lý các trạng thái giao dịch.
Bean Managed Transactions - Trong loại này, nhà phát triển quản lý vòng đời của các trạng thái giao dịch.
Giao dịch được quản lý vùng chứa
EJB 3.0 đã chỉ định các thuộc tính sau của giao dịch, mà các vùng chứa EJB triển khai:
REQUIRED - Cho biết phương thức kinh doanh phải được thực hiện trong giao dịch, nếu không, một giao dịch mới sẽ được bắt đầu cho phương thức đó.
REQUIRES_NEW - Cho biết rằng một giao dịch mới sẽ được bắt đầu cho phương thức kinh doanh.
SUPPORTS - Cho biết phương thức kinh doanh sẽ được thực hiện như một phần của giao dịch.
NOT_SUPPORTED - Chỉ ra rằng phương pháp kinh doanh không nên được thực hiện như một phần của giao dịch.
MANDATORY - Cho biết phương thức nghiệp vụ sẽ thực hiện như một phần của giao dịch, nếu không, ngoại lệ sẽ được ném ra.
NEVER - Cho biết nếu phương thức nghiệp vụ thực thi như một phần của giao dịch, thì một ngoại lệ sẽ được đưa ra.
Thí dụ
package com.tutorialspoint.txn.required;
import javax.ejb.*
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class UserDetailBean implements UserDetailRemote {
private UserDetail;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void createUserDetail() {
//create user details object
}
}
Phương thức nghiệp vụ createUserDetail () được thực hiện Bắt buộc bằng cách sử dụng Chú thích bắt buộc.
package com.tutorialspoint.txn.required;
import javax.ejb.*
@Stateless
public class UserSessionBean implements UserRemote {
private User;
@EJB
private UserDetailRemote userDetail;
public void createUser() {
//create user
//...
//create user details
userDetail.createUserDetail();
}
}
Phương thức nghiệp vụ createUser () đang sử dụng createUserDetail (). Nếu ngoại lệ xảy ra trong cuộc gọi createUser () và đối tượng Người dùng không được tạo thì đối tượng UserDetail cũng sẽ không được tạo.
Giao dịch do Bean quản lý
Trong Giao dịch được quản lý bằng Bean, Giao dịch có thể được quản lý bằng cách xử lý các ngoại lệ ở cấp ứng dụng.
Sau đây là những điểm chính cần được xem xét:
Start - Khi nào bắt đầu giao dịch trong một phương thức kinh doanh.
Sucess - Xác định kịch bản thành công khi một giao dịch được cam kết.
Failed - Xác định kịch bản thất bại khi một giao dịch được khôi phục.
Thí dụ
package com.tutorialspoint.txn.bmt;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.transaction.UserTransaction;
@Stateless
@TransactionManagement(value=TransactionManagementType.BEAN)
public class AccountBean implements AccountBeanLocal {
@Resource
private UserTransaction userTransaction;
public void transferFund(Account fromAccount, double fund ,
Account toAccount) throws Exception{
try{
userTransaction.begin();
confirmAccountDetail(fromAccount);
withdrawAmount(fromAccount,fund);
confirmAccountDetail(toAccount);
depositAmount(toAccount,fund);
userTransaction.commit();
}catch (InvalidAccountException exception) {
userTransaction.rollback();
}catch (InsufficientFundException exception) {
userTransaction.rollback();
}catch (PaymentException exception) {
userTransaction.rollback();
}
}
private void confirmAccountDetail(Account account)
throws InvalidAccountException {
}
private void withdrawAmount() throws InsufficientFundException {
}
private void depositAmount() throws PaymentException{
}
}
Trong ví dụ này, chúng tôi đã sử dụng UserTransaction giao diện đánh dấu sự bắt đầu của giao dịch bằng cách sử dụng userTransaction.begin()cuộc gọi phương thức. Chúng tôi đánh dấu việc hoàn thành giao dịch, bằng cách sử dụnguserTransaction.commit() và nếu có bất kỳ ngoại lệ nào xảy ra trong giao dịch thì chúng tôi sẽ khôi phục toàn bộ giao dịch bằng cách sử dụng userTransaction.rollback() cuộc gọi phương thức.