使用注解方式搭配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&characterEncoding=utf8&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要一致