spring 事务管理的简单配置

1:事务的优点

  事务管理对平时的业务逻辑的健壮性帮助很大,它保证了一个动作的原子性

  本例中主要体现在,购票或者购书中,业务逻辑如下:

    1:根据商品的ID查询该商品的价格,

    2:根据商品的价格去扣除用户的余额,但余额不足时,主动抛出异常

    3:当用户付款成功后,扣除商品库存,单库存不足时,主动抛出异常

   当3个步骤都操作成功后,数据库才会真正的持久化,即数据发生改变

  项目路径保存在     D:\海同\spring\9.14\9.14   中

  额外jar包:

    aopalliance.jar 和 aspectjweaver.jar  和 spring-aspects-4.2.0.RELEASE.jar 切面必须包

    c3p0-0.9.2.1.jar 和 commons-logging-1.1.1.jar  和  mysql-connector-java-5.1.7-bin.jar    数据库必须包

2:注解配置事务流程

    比较方便

  Repository层接口:

public interface GoodDao {
    //查找商品价格
    public int findPriceById(String id);

    //修改商品数量每次-1
    public void updateGoods(String id);

    //修改用户的余额
    public void updateBalance(String username,int price);
}

  Repository层实体:

/声明并装配到spring容器中去
@Repository("goodDao")
public class GoodDaoImpl implements GoodDao {
//    配置属性,从spring容器中取出 JdbcTemplate 对象
    @Resource(name = "jdbcTemplate")
    private JdbcTemplate jdbcTemplate;

    @Override
    public int findPriceById(String id) {
        String sql = "select price from goods where id = ?";
//        返回值为Integer的类类型
        return jdbcTemplate.queryForObject(sql,Integer.class,id);
    }

    @Override
    public void updateGoods(String id) {
        String select = "SELECT NUMBER FROM good_numbers WHERE id = ?";
        int number = jdbcTemplate.queryForObject(select,Integer.class,id);
        if (number < 1){//      该异常为自定义异常,仅继承了 RunTimeException 不贴上代码
            throw new GoodException("商品数量不足");
        }
        String sql = "update good_numbers set number = number-1 where id = ?";
        jdbcTemplate.update(sql,id);
    }

    @Override
    public void updateBalance(String username, int price) {
        String select = "SELECT balance FROM users WHERE username = ?";
        int balance = jdbcTemplate.queryForObject(select,Integer.class,username);
        if (balance < price){
//      该异常为自定义异常,仅继承了 RunTimeException 不贴上代码
        throw new UserException("用户余额不足"); }      String sql = "update users set balance = balance - ? where username = ?";      jdbcTemplate.update(sql,price,username); } }

  Service层的接口和实现:

  

//接口
public interface GoodService {
    public void buyGood(String username,String id);
}

//实现类
@Service("goodService")
public class GoodServiceImpl implements GoodService {
    @Resource(name = "goodDao")
    private GoodDao goodDao;

    @Transactional
    @Override
    public void buyGood(String username, String id) {
        int price = goodDao.findPriceById(id);
        goodDao.updateGoods(id);
        goodDao.updateBalance(username,price);
    }

}

   测试类

public class TestGoodService {
    private GoodService goodService;

    @Test
    public void test(){
        ApplicationContext applicationContext =new  ClassPathXmlApplicationContext("application.xml");
        this.goodService = (GoodService) applicationContext.getBean("goodService");
        goodService.buyGood("aa","1");
    }
}

  XML的配置方式:

  xml中仅仅是在配置文件中不同,和实体类中取出了所有的注解,故,只将xml文件帖出:

  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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
       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-4.2.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--读取配置文件-->
    <context:property-placeholder location="classpath:db.property"></context:property-placeholder>
    <!--加载数据源-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driverClass}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="user" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.password}"></property>
     </bean>
    <!--注入spring中的JdbcTemplate-->
    <bean  id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--注入repository-->
    <bean id="goodDao" class="com.yuwenhui.jdbc.xml.repository.GoodDaoImpl">
        <property name="jdbcTemplate" ref="jdbcTemplate"></property>
    </bean>
    <!--注入Service-->
    <bean id="goodService" class="com.yuwenhui.jdbc.xml.service.GoodServiceImpl">
        <property name="goodDao" ref="goodDao"></property>
    </bean>
    <!--配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--配置事务属性-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="find*" read-only="true"/>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>
    <!-- 配置aop -->
    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* com.yuwenhui.jdbc.xml.service.GoodServiceImpl.* (..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" id="aopAdvisor"/>
    </aop:config>
</beans>

 

 配置文件  db.propertys

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///spring
jdbc.user=root
jdbc.password=123456
时间: 2024-08-05 15:01:35

spring 事务管理的简单配置的相关文章

Spring事务管理-使用注解配置事务

一.概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下:为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects)支持声明式事务管理,特别是基于注解的声明式事务管理,简单易用 提供比其他事务API如JTA更简单的编程式事务管理

spring事务管理(xml配置)与spring自带连接数据库JdbcTemplate

什么是事务,很通俗的话来说就是,我们日常生活中总会出现在银行转账的业务,加入A向B转账100元,此时A的账户中应该减少100元,B的账户中增加100元,但是如果在A转完账B还没有接受的时候,服务器出现了故障,一般银行的系统都会给出交易失败的提示,并且A的账户中总金额也不会变,那么这就类似一个事务. 1.事务是单个逻辑单元工作单位执行的一系列操作 2.多个操作作为整体向系统提交,要么都执行,要么都不执行 3.事务时一个不可分割的逻辑单元 事务的4大特性:原子性.一致性.隔离性.持久性(ACID)

spring事务管理,xml配置aop事务和注解配置aop事务

xml配置和注解配合共同代码 AccountService.java public interface AccountService { //转账方法 void transfer(Integer from,Integer to,Double money); } AccountServiceImpl.java xml配置aop事务的AccountServiceImpl.java public class AccountServiceImpl implements AccountService {

spring学习笔记:spring事务管理 (转)

关于事物隔离级别, 脏读, 不可重复读, 幻读的理解, 另有一篇文章比较生动的介绍:http://blog.csdn.net/sunxing007/article/details/6427290 spring事务管理相关的接口: TransactionDefinition:代表一个事物,描述了事务的隔离级别, 超时时间,事务是否只读, 传播规则等等; TransactionStatus:描述事物的状态; PlatformTransactionManager:事务管理器接口, 只定义了3个方法:g

spring 事务管理配置

一般的,我们把事务配在service层,利用service的业务逻辑接口统一的管理. 为什么不用在dao层呢? 因为一个service有可能调用多个dao,而这多个dao有可能相互联系,有时候一个操作需要调用多次数据库,但是这多次调用要么全提交,要么全回滚. 因此,在dao层调用事务理论上说不是一个很明智的选择.应该有业务逻辑层service层负责事务,统一处理. Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

Spring事务管理

写这篇博客之前我首先读了<spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

Spring 事务管理高级应用难点剖析--转

第 1 部分 http://www.ibm.com/search/csass/search/?q=%E4%BA%8B%E5%8A%A1&sn=dw&lang=zh&cc=CN&en=utf&hpp=20&dws=cndw&lo=zh 概述 Spring 最成功,最吸引人的地方莫过于轻量级的声明式事务管理,仅此一点,它就宣告了重量级 EJB 容器的覆灭.Spring 声明式事务管理将开发者从繁复的事务管理代码中解脱出来,专注于业务逻辑的开发上,这是一件

详细介绍Spring事务管理

在学习spring事务管理时,我忍不住要问,spring为什么进行事务管理,spring怎么进行的事务管理?首先,为什么要进行事务,接下来说说spring是怎样进行事务管理的. 我们都知道spring提供两种管理事务的方式,一种是声明式事务,一种是编程式事务. Spring的声明式事务管理,基于Spring的AOP,不再需要不停地写commit,rollback,(但Spring仍然没有放弃编程式的事务管理策略). Spring的编程式事务管理,为我们提供了一个TransactionTempla