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----编程式事务管理的主要内容,如果未能解决你的问题,请参考以下文章

spring事务的开启方式(编程式和声明式)

Spring事务管理的实现方式:编程式事务与声明式事务

Spring事务管理的实现方式:编程式事务与声明式事务

阶段3 2.Spring_10.Spring中事务控制_9 spring编程式事务控制1-了解

Java EE之SSM框架整合开发 -- Spring的事务管理

Spring针对事务处理提供哪两种事务编程模式。