create database jdbctest;
use jdbctest;
create table account(
id int primary key auto_increment,
username varchar(50),
money int
);
insert into account(username,money) values('jack','10000');
insert into account(username,money) values('rose','10000');
主要包含两种事务,即进账和出账。
public interface AccountDao {
public void in(String inner,Integer money);
public void out(String outter,Integer money);
}
public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
//进账
@Override
public void in(String inner, Integer money) {
this.getJdbcTemplate().update(
"update account set money=money+? where username=?", money,
inner);
}
//出账
@Override
public void out(String outter, Integer money) {
this.getJdbcTemplate().update(
"update account set money=money-? where username=?", money,
outter);
}
}
只包含转账事务。
public class AccountService {
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
/**
*
* @param outter 转账人
* @param inner 收账人
* @param money 转账金额
*/
public void transfer(String outter,String inner,Integer money){
accountDao.in(inner, money);
//断电测试
// int i=1/0;
accountDao.out(outter, money);
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="dataSourceId" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver">property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/jdbctest">property>
<property name="user" value="root">property>
<property name="password" value="123">property>
bean>
<bean id="accountDaoId" class="com.scx.transferaccounts.AccountDaoImpl">
<property name="dataSource" ref="dataSourceId">property>
bean>
<bean id="accountServiceId" class="com.scx.transferaccounts.AccountService">
<property name="accountDao" ref="accountDaoId">property>
bean>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceId">property>
bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="transfer" propagation="REQUIRED" isolation="DEFAULT"/>
tx:attributes>
tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.scx.transferaccounts.AccountService.*(..))"/>
aop:config>
beans>
测试内容为jack向rose转账1000元。
public class Test {
@org.junit.Test
public void test(){
String xmlPath="com/scx/transferaccounts/applicationContext.xml";
ApplicationContext aContext=new ClassPathXmlApplicationContext(xmlPath);
AccountService service=(AccountService) aContext.getBean("accountServiceId");
service.transfer("jack", "rose", 1000);
}
}
测试结果
测试结果和预料一致。
当我们把service层的模拟断电代码取消注释
public void transfer(String outter,String inner,Integer money){
accountDao.in(inner, money);
//断电测试
int i=1/0;
accountDao.out(outter, money);
}