Spring--day03

作者: 键盘瞎 | 来源:发表于2017-03-08 21:52 被阅读61次

    非本人总结的笔记,抄点笔记复习复习。感谢传智博客及黑马程序猿


    感谢传智博客及黑马程序猿

    Spring的事务管理

    回顾事务

    什么是事务?

    事务四个特性?

    不考虑隔离性产生读问题

    不考虑隔离性产生一类写问题-丢失更新

    解决丢失更新

    解决读问题-设置事务隔离级别

    Mysql默认隔离级别 repeatable read

    Hibernate事务特点:不是自动提交

    应用场景:银行转账

    Spring使用事务接口

    • Spring事务管理高层抽象主要包括3个接口
    • PlatformTransactionManager:事务管理器
    • TransactionDefinition:事务定义信息(隔离、传播、超时、只读)
    • TransactionStatus:事务具体运行状态

    首先,配置事务管理器,使用接口PlatformTransactionManager对应的实现类配置

    配置说明

    Spring的事务概述

    Spring支持两种方式事务管理

    编程式的事务管理

    在实际应用中很少用;通过TransactionTemplate手动管理事务

    使用xml配置声明式事务

    开发中推荐使用(代码入侵性最小);Spring的声明式事务是通过AOP实现的

    搭建事务操作的环境(转账)

    第一步:创建数据库,创建表

    数据表

    第二步:创建dao,Service

    第三步:配置Service和dao对象,完成注入关系

    <bean id="userService" class="cn.xx.UserService">
        <property name="userDao" ref="userDao"></property>
    </bean>
    <bean id="userDao" class="cn.xx.UserDao"></bean>
    

    第四步:连接池配置,注入到dao

    <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"></property>
        <property name="user" value="root"></property>
        <property name="password" value="root"></property>
    </bean>
    
    <bean id="userDao" class="cn.xx.UserDao">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    
    public class UserDao extends JdbcTemplate{
      
    }
    

    第五步:在dao实现转账的方法

    public void out() {
        String sql = "update account set money = money - 100 where id = ?";
        this.getJdbcTemplate().update(sql, 1);
    }
    
    public void in() {
        String sql = "update account set money = money + 100 where id = ?";
        this.getJdbcTemplate().update(sql, 2);
    }
    

    第六步:在Service里面调用dao的方法实现转账的逻辑

    public void accountMoney {
        userDao.out();
        userDao.in();
    }
    

    产生问题

    userDao.out();
    int a = 10 / 0;
    userDao.in();
    

    如果东方不败少了100.之后,出现异常,小奥不会多100,但是100丢失了

    使用事务可以解决钱丢失的问题。

    编程式事务管理

    第一步:导入事务的相关jar包,引入相关的约束

    第二步:配置事务管理器

    使用jdbcTemplate,使用PlatformTransactionManager接口里面的是实现类DataSourceTransactionManager

    <bean id="transactionManager" class="org.springframework.jdb.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    

    第三步:配置事务管理器的模板

    <bean id="" class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager" ref="transactionManager"></property>
    </bean>
    

    第四步:在Service里面注入事务管理器的模板

    public class UserService{
        private TransactionTemplate transactionTemplate;
        public void setTransactionTemplate getTransactionTemplate(TransactionTemplate transactionTemplate) {
            this.transactionTemplate = transactionTemplate;
        }
    }
    
    <bean id="userService" class="cn.xx.UserService">
        <property name="userDao" ref="userDao"></property>
        <property name="transactionTemplate" ref="transactioinTemplate"></property>
    </bean>
    

    第五步:需要在Service里面手动写代码,进行事务管理

    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        protected void doInTransactionWithoutResult(TransactionStatus args0) {
            userDao.out();
            int a = 10 / 0;
            userDao.in();
        }
    });
    

    第六步:测试编程是事务操作

    如果进行操作时候,没有出现异常,正常执行,但是调用了一个方法之后,出现了异常,事务回滚。

    声明式事务管理(重点)

    基于aspectj的xml方式

    使用Aop思想实现的事务管理

    第一步:配置事务管理器

    <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>
            <!-- name:service里面的方法accountMoney -->
            <tx:method name="accountMoney" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
    

    第三步:配置切面

    <aop:config>
        <aop:pointcut expression="execution(* cn.xx.UserService.accountMoney(..))" id="point1"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="point1"/>
    </aop:config>
    

    基于注解方式

    第一步:配置事务管理器

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    

    第二步:开始事务的注解

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

    第三步:在哪个类中的方法使用事务,就在那个类上面使用注解

    @Transaction
    public class UserService {
      
    }
    

    不是很详细,还请大家自己找些资料查看

    相关文章

      网友评论

        本文标题:Spring--day03

        本文链接:https://www.haomeiwen.com/subject/sjkpgttx.html