Spring 学习笔记 事务管理 解决购买彩票问题

  此文章接上一篇》》》
  此配置文件没有采用事务管理,所以购买股票的时候,出现了数据库中账户金额减少了,但是股票数目没有增加的不一致情况。
通过三种方式解决会出现的操作不一致的方法:
1:使用事务代理工厂
2:使用事务注解驱动
3:使用aspectj的事务通知aop 需要我们导入aspect的两个jar包 com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar 和spring-aspects-4.2.1.RELEASE.jar
下面还是粘贴代码,主要是针对第三种方法解决: 注意更改了xml主配置文件bean在test测试方法需要修改 service = (IBuyStockService) ac.getBean(“BuyStockService”); 其他不需要修改
我们需要在主配置文件做如下的配置
1:使用事务代理工厂 主要针对配置文件


        <bean id="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>

        bean>

       
       <bean id="serviceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
       <property name="target" ref="BuyStockService"/>
       <property name="transactionManager" ref="transactionManager"/>
       <property name="transactionAttributes">
       <props>
       
       <prop key="open*">ISOLATION_DEFAULT,PROPAGATION_REQUIREDprop>
       <prop key="buyStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-BuyStockExceptionprop>
       props>

       property>

       bean>

2:使用事务注解驱动
这里用在serviceImpl里面使用注解的方式来实现

@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
    @Override
    public void openAccouont(String aname, double money) {
        ado.insertAccount(aname,money);

    }
    @Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
    @Override
    public void openStock(String sname, int count) {
         idao.insertStock(sname,count);

    }
    @Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,rollbackFor=BuyStockException.class)
    @Override
    public void buyStock(String aname, double money, String sname, int count) throws BuyStockException {
          Boolean isBuy = true;
         ado.updateAccount(aname,money,isBuy);

         //人为的制造异常,然后引出事务


         if (true) 
         {
              throw new BuyStockException("购买股票不成功!!!但是钱被扣了");
        }
          idao.updateStock(sname,count,isBuy);
    }

在主配置文件只需要做一个配置即可

    
     <tx:annotation-driven transaction-manager="transactionManager"/>

3:使用aspectj的事务通知aop

 
          <tx:advice id="txAdvice" transaction-manager="transactionManager">
          <tx:attributes>
          
          <tx:method name="open" isolation="DEFAULT" propagation="REQUIRED"/>
          <tx:method name="buyStock" isolation="DEFAULT" propagation="REQUIRED" rollback-for="BuyStockException"/>
          tx:attributes>
          tx:advice>

       
       <aop:config>
       
       <aop:pointcut expression="execution(* *..service.*.buyStock(..))" id="myPointcut"/>
            
       <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"/>
       aop:config>

最后在运行中我们都能看到即使人为的制造了异常,但是还能满足事务的原子性!充分保证了否买彩票实例的实现

作为实习生,因为今天下午经理分配了一个新的任务,所以下面的SSH框架的整合暂时没有实现,但是我会在空余时间抽空完成!
今天经理给了公司以前做的安全产品,要我做功能移植,因为项目比较老,所以在数据库移植方法存在颇多问题,加上其中一个项目的sql语句暂时没有,所以只能先自己看看功能!
希望自己赶快融入到项目开发中去!!fighting,让我们一起加油吧

你可能感兴趣的:(spring,数据库,事务,管理,股票,Spring学习)