spring学习AOP之添加事务

使用注解方式搭配AOP完成
本文是模拟转账操作:简单来说转账就是从转账人账户里减少转账的数量,在被转账者的账户里加上同样的数量。但如果在转账者账户减少余额后出现了故障,那么就会造成转账者余额减少了而被转账者余额没有变的问题。事务就是避免这一类问题发生的存在,要么就全部执行成功,要么就回到起点

老规矩,创建dao类和service类
dao类:

@Service("shiWuService2")
public class ShiWuDao2 {
	//@Autowired
	@Resource(name="jdbcTemplate")
	private JdbcTemplate jdbcTemplate;
	/*public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}*/
	public void accountMoney(){
		String sql="update account set salary=salary-? where username=?";
		Object param[]={1000,"小王"};
		jdbcTemplate.update(sql, param);
		int i=4/0;//模拟异常
		String sql2="update account set salary=salary+? where username=?";
		Object param2[]={1000,"小张"};
		jdbcTemplate.update(sql2, param2);
	}
	public void goMoney(){
		String sql="update account set salary=salary-? where username=?";
		Object param[]={1000,"小王"};
		jdbcTemplate.update(sql, param);
	}
	public void comeMoney(){
		String sql="update account set salary=salary+? where username=?";
		Object param[]={1000,"小张"};
		jdbcTemplate.update(sql, param);
	}
}

service类:

//@Transactional(value="transactionManager")
@Transactional
@Service("shiWuService2")
public class ShiWuService2 {
	@Resource(name="shiWuDao2")
	private ShiWuDao2 shiWuDao2;

	public void setShiWuDao2(ShiWuDao2 shiWuDao2) {
		this.shiWuDao2 = shiWuDao2;
	}
	public void accountMoney(){//转账
		/*//小王转出1000
		shiWuDao2.goMoney();
		int i=4/0;//模拟异常
		//小张转进1000
		shiWuDao2.comeMoney();*/
		shiWuDao2.accountMoney();
	}
}

然后是在配置文件中添加相应的代码

 <!-- 开启AOP -->
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
        <!--开启注解  -->
        <context:component-scan base-package="springshiwu"></context:component-scan>
        <!-- 连接池配置 -->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
          <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
          <property name="jdbcUrl" value="jdbc:mysql://localhost:3307/spring?useUnicoding=true&amp;characterEncoding=utf8&amp;useSSL=false"></property>
          <property name="user" value="root"></property>
          <property name="password" value="513721abcd"></property>
        </bean>
         <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
           <property name="dataSource" ref="dataSource"></property>
         </bean>
         
         <!-- <bean id="shiWuService2" class="springshiwu.ShiWuService2">
           <property name="shiWuDao2" ref="shiWuDao2"></property>
         </bean>
         
         <bean id="shiWuDao2" class="springshiwu.ShiWuDao2">
           <property name="jdbcTemplate" ref="jdbcTemplate" ></property>
         </bean> -->
       
        <!-- 1.配置事务管理器 -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <!-- 注入datasource !-->
          <!--注入连接池  -->
          <property name="dataSource" ref="dataSource"></property>
        </bean>
        <!-- 2.开启事务注解 -->
        <tx:annotation-driven transaction-manager="transactionManager"/>
        <!--3.在需要使用事务的方法所在类上添加注解@Transactional  -->

注意:在需要添加事务的方法的类上添加注解:
//@Transactional(value=“transactionManager”)
@Transactional

最后创建一个测试类进行测试

public static void main(String[] args) {
		// TODO Auto-generated method stub
		ApplicationContext context=new ClassPathXmlApplicationContext("springshiwu2.xml");
		ShiWuService2 service= (ShiWuService2) context.getBean("shiWuService2");
		service.accountMoney();
	}
}

数据库初始数据
在这里插入图片描述

int i=4/0;//模拟异常
在减少余额和增加余额之间模拟了异常发生

最后来看看执行效果
在这里插入图片描述
出现了除数为0的异常
我们再看看数据库:
两个人的余额都没有发生变化,确实达到了目的

注意:在需要添加事务的方法的类上添加注解:
//@Transactional(value=“transactionManager”)
@Transactional

value值和配置文件中事务管理器的id要一致

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值