Spring事务管理2----编程式事务管理
Posted 适AT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring事务管理2----编程式事务管理相关的知识,希望对你有一定的参考价值。
编程式事务管理
通过使用将Spring框架提供的TransactionTemplate模板注入到业务层来进行事务管理,这样对业务层原来的代码修改过多。不利于项目的后期维护。
以下是声明式事务管理的具体代码实现:
环境搭建:http://www.cnblogs.com/kuoAT/p/7803193.html
Dao层
package com.sdf.spring; /** * @author AT * 转账dao层 */ public interface AccountDao { /** * 转出钱 * @param outer * @param money */ public void remove(String outer,Double money); /** * 转入钱 * @param input * @param money */ public void add(String input,Double money); }
dao层实现类
package com.sdf.spring; import org.springframework.jdbc.core.support.JdbcDaoSupport; /** * 转账dao层实现 */ public class AccountDaoimpl extends JdbcDaoSupport implements AccountDao{ /** * 转出钱 * @param outer * @param money */ @Override public void remove(String outer, Double money) { String sql = "update account set money = money - ? where name = ?"; this.getJdbcTemplate().update(sql, money,outer); } /** * 转入钱 * @param input * @param money */ @Override public void add(String input, Double money) { String sql = "update account set money = money + ? where name = ?"; this.getJdbcTemplate().update(sql, money,input); } }
service业务层
package com.sdf.spring; /** * @author AT * 转账业务接口 */ public interface AccountSevice { public void transfer(String input,String out,Double money);//消费 }
service业务层实现类
/** * @author AT * 编程式事务管理 */ public class AccountServiceImpl implements AccountSevice { @Resource(name="accountDao") private AccountDao accountDao; //在业务类中注入事务模板 @Resource(name="transactionTemplate") private TransactionTemplate transactionTemplate; @Override public void transfer(final String input, final String out,final Double money) { // accountDao.remove(out, money); // int a = 1/0; // accountDao.add(input, money); transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { accountDao.add(input, money); int a = 1/0;//模拟转账过程中发生故障 accountDao.remove(out, money); } }); } public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } public void setTransactionTemplate(TransactionTemplate transactionTemplate) { this.transactionTemplate = transactionTemplate; } }
applicationContext.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 引入外部属性文件 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 配置C3P0连接池 --> <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- dao层和业务的类 --> <bean id="accountDao" class="com.sdf.spring.dao.impl.AccountDaoimpl"> <property name="dataSource" ref="datasource"></property> </bean> <bean id="accountService" class="com.sdf.spring.service.impl.AccountServiceImpl"> <property name="accountDao" ref="accountDao"/> <property name="transactionTemplate" ref="transactionTemplate"/> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="datasource"/> </bean> <!-- 定义事务管理模板:Spring为了简化事务管理的代码提供的类 --> <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"/> </bean> </beans>
测试类
/** * @author AT * 测试转账信息 编程式事务管理 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class AccountTest { @Resource(name="accountService") private AccountSevice accountService; @Test public void test01(){ accountService.transfer("A", "B", 100d); } public void setAccountService(AccountSevice accountService) { this.accountService = accountService; } }
以上是关于Spring事务管理2----编程式事务管理的主要内容,如果未能解决你的问题,请参考以下文章
阶段3 2.Spring_10.Spring中事务控制_9 spring编程式事务控制1-了解