事務是工作項目的單個單元下面的ACID屬性。 ACID代表原子性,一致性,獨立性和持久性。
Atomic-如果有任何工作項目的失敗,整個單元被認為失敗。成功意味著所有項目成功執(zhí)行。
Consistent-事務必須使系統(tǒng)保持一致的狀態(tài)。
Isolated-每個事務執(zhí)行獨立于任何其他交易。
Durable-如果已經執(zhí)行或承諾交易應該生存系統(tǒng)故障。
EJB容器/服務器是事務服務器和處理事務上下文傳播和分布式事務。事務可以由容器或者通過自定義代碼在bean的代碼中處理進行管理。
Container Managed Transactions 容器管理事務 -在這種類型中,容器管理事務的狀態(tài)。
Bean Managed Transactions Bean管理事務-在這種類型,開發(fā)管理事務狀態(tài)的生命周期。
EJB 3.0 的 EJB 容器實現(xiàn)已指定以下屬性的事務記錄。
REQUIRED -表明業(yè)務方法已被交易,否則一個新的事務將開始該方法中執(zhí)行。
REQUIRES_NEW -表明啟動一個新事務的業(yè)務方法。
SUPPORTS -指示業(yè)務方法將作為事務的一部分執(zhí)行。
NOT_SUPPORTED -表明業(yè)務方法不應該執(zhí)行作為事務的一部分。
MANDATORY-表示業(yè)務方法將執(zhí)行作為交易的一部分,否則將引發(fā)異常。
NEVER -明如果業(yè)務方法執(zhí)行作為事務的一部分,那么就會拋出一個異常。
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 } }
createUserDetail()業(yè)務方法需要使用需要注釋
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(); } }
createUser() 業(yè)務方法使用 createUserDetail()。如果在 createUser() 調用期間發(fā)生異常,并且不創(chuàng)建用戶對象然后 UserDetail將也不創(chuàng)建對象
在Bean管理事務,事務可以通過在應用程序級異常處理進行管理。下面是要考慮的關鍵點
Start 開始 -當在業(yè)務方法啟動事務。
Sucess 成功 -確定成功場景當事務被提交。
Failed 失敗 -未能確定方案時,一個事務將被回滾。
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{ } }
在本例中,我們使用UserTransaction接口標記事務的開始使用userTransaction.begin()方法調用。我們紀念完成事務通過userTransaction.commit()方法,如果交易中發(fā)生的任何異常情況然后我們回滾整個事務使用userTransaction.rollback()方法調用
更多建議: