Spring(十一)Spring事物
事務是訪問數據庫的一個操作序列,DB應用系統通過事務集來完成對數據的存取。
事務必須遵循4個原則,即常說的 ACID
A,Automicity,原子性,即事務要麽被全部執行,要麽被全部不執行。如果事務下的子事務全部提交成功,則所有數據庫操作被提交,否則,應進行事務回滾。
C,Consistency,一致性,即狀態轉換必須是由一種正確的狀態轉換到另外一種正確的狀態。
I,Isolation,隔離性,即相互間必須不能被影響。
D,Durabillity,持久性,即事務提交後將被永久保存,即便出現其他故障,事務處理結果也應得到保存。
事務的隔離級別
串行化,Serializable,一個事務在執行過程中完全看不到其他事務對數據庫所做的更新。
可重復讀,Repeatable Read,一個事務在執行過程中可以看到其他事務已經提交的記錄,但是不能看到其他事務對已有記錄的更新。
讀已提交數據,Read Commited,一個事務在執行過程中可以看到其他事務已經提交的記錄,而且能看到其他事務對已有記錄的更新。
讀未提交數據,Read UnCommited,一個事務在執行過程中可以看到其他事務沒有提交的記錄,而且能看到其他事務沒有提交的記錄的更新
簡單介紹完事務之後,我們用一個例子來具體使用一下事務:購買股票的案例
1.數據庫
1.1股票表
1.2:賬戶余額表:
2.實體類
2.1:account類
2.2:stock類
3.dao 接口IAccountDao
IAccountDaoImpl:
IStockDao
IStockDaoImpl:
接下來創建Service
然後寫配置文件;
然後是註解事物:只需要改service裏就可以:
@Transactional()
public void buyStock(int aid, int abalance, int sid, int scount) throws Exception {
//購買股票 買入 和拋出
boolean isBuy=true;//購買股票
accountDAO.updateAccount(aid,abalance,isBuy);
/* if (true){
throw new Exception("111");
}*/
stockDAO.updateStock(sid,scount,isBuy);
}
public IStockDAO getStockDAO() {
return stockDAO;
}
public void setStockDAO(IStockDAO stockDAO) {
this.stockDAO = stockDAO;
}
public IAccountDAO getAccountDAO() {
return accountDAO;
}
public void setAccountDAO(IAccountDAO accountDAO) {
this.accountDAO = accountDAO;
}
}
還有最後一種AspectJ Aop註解方式
<!--方式三:AspectJ AOP 註解-->
<tx:advice id="stockAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="buy*" isolation="DEFAULT" propagation="REQUIRED" rollback-for="StockException"/>
</tx:attributes>
</tx:advice>
<aop:config>
1.切點
<aop:pointcut id="mypointcut" expression="execution(* *..service.impl.*.*(..))"></aop:pointcut>
&3.顧問
<aop:advisor advice-ref="stockAdvice" pointcut-ref="mypointcut"></aop:advisor>
</aop:config>
最後就是測試類:
Spring(十一)Spring事物