spring事务管理

Spring事务管理api

  1 spring事务管理两种方式

    第一种 编程式事务管理(不用)

    第二种 声明式事务管理

    (1)基于xml配置文件实现

    (2)基于注解实现

  2 spring事务管理的api介绍

      

    (1)spring针对不同的dao层框架,提供接口不同的实现类

      

    (2)首先 配置事务管理器

    搭建转账环境

        1 创建数据库表,添加数据

        2 创建service和dao类,完成注入关系

    <!-- 配置c3p0连接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 注入属性值 -->
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql:///spring_day03"></property>
        <property name="user" value="root"></property>
        <property name="password" value="root"></property>
    </bean>
    
    <bean id="ordersService" class="cn.itcast.service.OrdersService">
        <property name="ordersDao" ref="ordersDao"></property>
    </bean>
    <bean id="ordersDao" class="cn.itcast.dao.OrdersDao">
        <property name="jdbcTemplate" ref="jdbcTemplate"></property>
    </bean>
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

      (1)service层又叫业务逻辑层

      (2)dao层,单纯对数据库操作层,在dao层不添加业务

      (3)需求:小王 转账 1000 给 小马

      - 小王少1000

      - 小马多1000

    /*
     * 做对数据库操作的方法,不写业务操作
     * */
    //小王少钱的方法
    public void lessMoney() {
        String sql = "update account set salary=salary-? where username=?";
        jdbcTemplate.update(sql, 1000,"小王");
    }
    
    //小马多钱的方法
    public void moreMoney() {
        String sql = "update account set salary=salary+? where username=?";
        jdbcTemplate.update(sql, 1000,"小马");
    }
    //调用dao的方法
    //业务逻辑层,写转账业务
    public void accountMoney() {
        //小王少1000
        ordersDao.lessMoney();
        
        //出现异常
        int i = 10/0;
        
        //小马多1000
        ordersDao.moreMoney();
    }

        3 产生问题:

        (1)如果小王少了1000之后,出现异常,小马不会多1000,钱丢失了

        4 解决:

        (1)添加事务解决,出现异常进行回滚操作

    声明式事务管理(xml配置)

      1 配置文件方式使用aop思想配置

        第一步 配置事务管理器

    <!-- 第一步 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入dataSource -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

        第二步 配置事务增强

    <!-- 第二步 配置事务增强 -->
    <tx:advice id="txadvice" transaction-manager="transactionManager">
        <!-- 做事务操作 -->
        <tx:attributes>
            <!-- 设置进行事务操作的方法匹配规则  -->
            <tx:method name="account*" propagation="REQUIRED"/>
            <!-- <tx:method name="insert*" /> -->
        </tx:attributes>
    </tx:advice>

        第三步 配置切面

    <!-- 第三步 配置切面 -->
    <aop:config>
        <!-- 切入点 -->
        <aop:pointcut expression="execution(* cn.itcast.service.OrdersService.*(..))" id="pointcut1"/>
        <!-- 切面 -->
        <aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"/>
    </aop:config>

      声明式事务管理(注解)

          第一步 配置事务管理器

    <!-- 第一步配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

          第二步 配置事务注解

    <!-- 第二步 开启事务注解 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

          第三步 在要使用事务的方法所在类上面添加注解

@Transactional
public class OrdersService {
原文地址:https://www.cnblogs.com/kpsmile/p/10145242.html