您的位置:首页 > 编程语言 > Java开发

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

2017-08-07 20:56 656 查看
  此文章接上一篇》》》

  此配置文件没有采用事务管理,所以购买股票的时候,出现了数据库中账户金额减少了,但是股票数目没有增加的不一致情况。

通过三种方式解决会出现的操作不一致的方法:

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>

<!-- 注册事务     增强对象是service -->
<bean id="serviceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target" ref="BuyStockService"/>
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<!-- 这里配置的是在连接点方法上要应用什么属性方法    隔离级别isolation_dafault    传播propagation_required-->
<prop key="open*">ISOLATION_DEFAULT,PROPAGATION_REQUIRED</prop>
<prop key="buyStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-BuyStockException</prop>
</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

<!-- 注册 txAdvice   事务通知 -->
<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"/>
</
4000
tx:attributes>
</tx:advice>

<!-- 注册aop -->
<aop:config>
<!-- 指明切入点   所有的service方法的切入点 -->
<aop:pointcut expression="execution(* *..service.*.buyStock(..))" id="myPointcut"/>
<!-- 连接到连接点 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"/>
</aop:config>


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

作为实习生,因为今天下午经理分配了一个新的任务,所以下面的SSH框架的整合暂时没有实现,但是我会在空余时间抽空完成!

今天经理给了公司以前做的安全产品,要我做功能移植,因为项目比较老,所以在数据库移植方法存在颇多问题,加上其中一个项目的sql语句暂时没有,所以只能先自己看看功能!

希望自己赶快融入到项目开发中去!!fighting,让我们一起加油吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息