标签:
MySQL存储过程
DROP PROCEDURE IF EXISTS transferMoney; -- 实现转账功能的存储过程 CREATE PROCEDURE transferMoney ( IN fromUserId INT,-- 付款方 IN toUserId INT, -- 收款方 IN money DOUBLE) -- 转账金额 BEGIN DECLARE state INT; -- 运行状态 SET state = 0; -- 0表示正常,99表示异常 START TRANSACTION; -- 启用事务 -- 先扣除付款人的金额 UPDATE USER u SET u.money = u.money-money WHERE id = fromUserId; IF ROW_COUNT()=0 then -- 如果影响记录为0,表示异常,标示为99 set state = 99; END IF; -- 再增加收款人的金额 UPDATE USER u SET u.money = u.money+money WHERE id = toUserId; IF ROW_COUNT()=0 then -- 如果影响记录为0,表示异常,标示为99 set state = 99; END IF; -- 如果运行正常则提交,否则,回滚 IF state=0 then COMMIT; ELSE ROLLBACK; END IF; END;
MyBatis映射文件UserMapper.xml
<select id="transferMoney" statementType="CALLABLE" parameterType="java.util.HashMap"> { call transferMoney (#{fromUserId,mode=IN,jdbcType=INTEGER}, #{toUserId,mode=IN,jdbcType=INTEGER}, #{money,mode=IN,jdbcType=DOUBLE}) } </select>
Java代码
@Override public void transferMoneyByProcedureTX(int fromUserId, int toUserId, double money) { Map<String,Object> map = new HashMap<String,Object>(); map.put("fromUserId",fromUserId); map.put("toUserId", toUserId); map.put("money", money); userDao.transferMoney(map); }
Spring事务配置
<!-- 第一种配置事务的方式 ,tx--> <tx:advice id="txadvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" rollback-for="Exception" /> <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception" /> <tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="*TX" propagation="REQUIRED" rollback-for="Exception"/> <!-- 存储过程都是自带了事务处理,所以这里配置NEVER了 --> <tx:method name="*Procedure" propagation="NEVER" rollback-for="Exception"/> <tx:method name="*" propagation="REQUIRED" read-only="true"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="serviceMethod" expression="execution(* com.ssm.service.*.*(..))"/> <aop:advisor pointcut-ref="serviceMethod" advice-ref="txadvice"/> </aop:config>
标签:
原文地址:http://www.cnblogs.com/cocoat/p/4905226.html