事务
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和代理机制这三部分