需要事务管理器:真正管理事务对象.
* Spring提供了事务管理的模板(工具类.)
第一步:注册事务管理器:。
第二步:注册事务模板类:。
第三步:在业务层注入模板类:(模板类管理事务)。
第四步:在业务层代码上使用模板。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置C3P0连接池 加入jar:com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/info" /><!--
这里用的是jdbcUrl -->
<property name="user" value="root" />
<property name="password" value="mysql123" />
</bean>
<!-- 业务类 -->
<bean id="accountService" class="cn.my.demo1.DaoImpl.AccountServiceImpl">
<!-- 在业务层注入Dao -->
<property name="accountDao" ref="accountDao" />
<!-- 在业务层注入事务管理的模板 -->
<property name="transactionTemplate" ref="transactionTemplate"></property>
</bean>
<!-- 持久层类 -->
<bean id="accountDao" class="cn.my.demo1.DaoImpl.AccountDaoImpl">
<!-- 注入连接池对象,通过连接池对象创建模板 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 事务管理的模板 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 需要注入连接池,通过连接池获得连接 -->
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
处理转账的业务:
package cn.my.demo1.DaoImpl;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
import cn.my.demo1.Dao.AccountDao;
import cn.my.demo1.Dao.AccountService;
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao;//注入持久层
private TransactionTemplate transactionTemplate;//注入事务管理模板
public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
this.transactionTemplate = transactionTemplate;
}
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
/**
* 转账的方法
*/
@Override
public void transfer(final String from, final String to, final Double money) {
// TODO Auto-generated method stub
//参数是TransactionCallback<Object> arg0,一个接口;然后通过它的实现类TransactionCallbackWithoutResult
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
// TODO Auto-generated method stub
accountDao.out(from, money);
//如果出现异常数据会回滚,
// int d=5/0;
accountDao.in(to, money);
}
});
}
}
注意: