事务是访问数据库的一个操作序列,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>
最后就是测试类: