事务
1.什么是事务?
事务是我们要执行的一系列操作,要么完全执行,要么完全不执行。这样可以确保所有的操作都成功,否者不会跟新数据库。
2.事务有两种结果:
所有的操作执行成功,提交事务。如果有一个操作执行失败,将发生回滚,撤销之前到事务发生开始时执行的操作。
3.spring的事务使用:
有两个类DataSourceTransactionManager,DefaultTransactionDefinition
执行过程:开启事务-》执行操作-》如果执行成功提交事务,如果发生异常就回滚事务。
spring的具体代码:
/** * * @author junwei.ou * 任务管理 * */ public class ScoreTask { @Resource private DataSourceTransactionManager transactionMapper; @Resource private DefaultTransactionDefinition transactionDefinition; public void update(Map<?,?> resData){ TransactionStatus status = transactionMapper.getTransaction(transactionDefinition); String dd =(String)resData.get("accNo"); String orderid = (String)resData.get("orderId"); String acco[]=ScoreConstant.GET_ACCNO(); if(dd.equals(acco[0])){ OrderTrade2 trade = orderTradeService.getOrderTradeBySeriNum(orderid); //根据订单号查询订单 String[] ratio = ScoreConstant.SCORE_DOUBLE_RATIO(); int score = (int)( Double.parseDouble(ratio[0])*trade.getRealPay()); //应增加的双倍积分 User2Example ex = new User2Example(); ex.createCriteria().andOpenIdEqualTo(trade.getOpenId()); //根据OpenId得到用户信息 List<User2> user2List = user2Mapper.selectByExample(ex); User2 user = user2List.get(0); int ss = user.getScore()==null?0:user.getScore(); user.setScore(score+ss); //更新用户信息 try { user2Mapper.updateByOpenId(user); trade.setState(1); // orderTradeService.updateById2(trade); //跟新订单信息 orderTrade2Mapper.updateByPrimaryKey(trade); //双倍积分记录 UserScore userScore= new UserScore(); userScore.setOpenId(trade.getOpenId()); userScore.setScoreNumber(score); userScore.setScoreDescrible("联名卡双倍积分 订单编号"+trade.getOrderSerioNum()); userScore.setCreateTime(new Date()); userScore.setScoreTyple(2); int number=userScoreMapper.insert(userScore); System.out.println(number); transactionManager.commit(status); //提交事务并跟新数据库 } catch (Exception e) { e.printStackTrace(); transactionManager.rollback(status);//发生异常时回滚事务 } } } }注意:一定不能缺少下面这句代码 transactionMapper.commit(status);
spring的事务配置的方法。
spring配置文件中有三种组成:其中有DataSource、TransactionManager和代理机制这三部分