编程式事务:需要编写代码控制事务在哪里开始,哪里提交,哪里回滚。
public class StuCardServiceImpl implements StuCardService{
private StuCardDao scDao;
private TransactionTemplate transactionTemplate;
/**
* 转账支付,当金额不足时,抛出异常。
* @param targetCardNo 目标账号
* @param sourceCardNo 源账号
* @param money 转账金额
*/
public void transaferMoney(String targetCardNo, final String sourceCardNo, final String money) {
transactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
StuCard sourceCard = scDao.getStuCardInfoById(sourceCardNo);
StuCard targetCard = scDao.getStuCardInfoById(targetCardNo);
//修改后勤人员信息
sourceCard.setMoney(sourceCard.getMoney().subtract(new BigDecimal(money)));
targetCard.setMoney(targetCard.getMoney().add(new BigDecimal(money)));
scDao.updateStuCardByCardNo(targetCard);
if(sourceCard.getMoney().compareTo(new BigDecimal("0")) < 0){
throw new NoEnoughMoneyException("账户余额不足,请充值。。。。");
}
scDao.updateStuCardByCardNo(sourceCard);
System.out.println("支付完成!商品购买成功!!!!!");
return null;
}
});
}
}
org.springframework.transaction.support.TransactionTemplate.execute() 方法有一个 TransactionCallback 类型的参数,该接口中定义了一个 doInTransaction() 方法,通常我们以匿名内部类的方式实现 TransactionCallback 接口,并在其 doInTransaction() 方法中书写业务逻辑代码。这里可以使用默认的事务提交和回滚规则,这样在业务代码中就不需要显式调用任何事务管理的 API。doInTransaction() 方法有一个TransactionStatus 类型的参数,我们可以在方法的任何位置调用该参数的setRollbackOnly() 方法将事务标识为回滚的,以执行事务回滚。