首页 > 编程语言 > 详细

14 Spring 应用之事务支持

时间:2020-05-10 20:36:25      阅读:38      评论:0      收藏:0      [点我收藏+]

1.1       事务回顾

1. 事务:指的是逻辑上一组操作,组成这个事务的各个执行单元,要么一起成功,要么一起失败!

2. 事务的特性

    * 原子性

    * 一致性

    * 隔离性

    * 持久性

 

3. 如果不考虑隔离性,引发安全性问题

    * 读问题:

        * 脏读:

        * 不可重复读:

        * 虚读:

 

4. 如何解决安全性问题

* 读问题解决,设置数据库隔离级别

1.2       Spring框架的事务管理相关的类和API

1. PlatformTransactionManager接口     -- 平台事务管理器.(真正管理事务的类)。该接口有具体的实现类,根据不同的持久层框架,需要选择不同的实现类!

2. TransactionDefinition接口          -- 事务定义信息.(事务的隔离级别,传播行为,超时,只读)

3. TransactionStatus接口              -- 事务的状态

 

4. 总结:上述对象之间的关系:平台事务管理器真正管理事务对象.根据事务定义的信息TransactionDefinition 进行事务管理,在管理事务中产生一些状态.将状态记录到TransactionStatus中

 

5. PlatformTransactionManager接口中实现类和常用的方法

    1. 接口的实现类

        * 如果使用的Spring的JDBC模板或者MyBatis框架,需要选择DataSourceTransactionManager实现类

        * 如果使用的是Hibernate的框架,需要选择HibernateTransactionManager实现类

 

    2. 该接口的常用方法

        * void commit(TransactionStatus status)

        * TransactionStatus getTransaction(TransactionDefinition definition)

        * void rollback(TransactionStatus status)

 

6. TransactionDefinition

    1. 事务隔离级别的常量

        * static int ISOLATION_DEFAULT              -- 采用数据库的默认隔离级别

        * static int ISOLATION_READ_UNCOMMITTED

        * static int ISOLATION_READ_COMMITTED

        * static int ISOLATION_REPEATABLE_READ

        * static int ISOLATION_SERIALIZABLE

 

    2. 事务的传播行为常量(不用设置,使用默认值)

        * 先解释什么是事务的传播行为:解决的是业务层之间的方法调用!!

 

        * PROPAGATION_REQUIRED(默认值) -- A中有事务,使用A中的事务.如果没有,B就会开启一个新的事务,将A包含进来.(保证A,B在同一个事务中),默认值!!

        * PROPAGATION_SUPPORTS          -- A中有事务,使用A中的事务.如果A中没有事务.那么B也不使用事务.

        * PROPAGATION_MANDATORY         -- A中有事务,使用A中的事务.如果A没有事务.抛出异常.

 

        * PROPAGATION_REQUIRES_NEW      -- A中有事务,将A中的事务挂起.B创建一个新的事务.(保证A,B没有在一个事务中)

        * PROPAGATION_NOT_SUPPORTED     -- A中有事务,将A中的事务挂起.

        * PROPAGATION_NEVER             -- A中有事务,抛出异常.

 

        * PROPAGATION_NESTED            -- 嵌套事务.当A执行之后,就会在这个位置设置一个保存点.如果B没有问题.执行通过.如果B出现异常,运行客户根据需求回滚(选择回滚到保存点或者是最初始状态)

 

1.3       spring框架事务管理的分类

1. Spring的编程式事务管理(不推荐使用)

        * 通过手动编写代码的方式完成事务的管理(不推荐)

 

2. Spring的声明式事务管理(底层采用AOP的技术)

        * 通过一段配置的方式完成事务的管理

1.3.1      编程式事务管理(了解)

1. 说明:Spring为了简化事务管理的代码:提供了模板类 TransactionTemplate,所以手动编程的方式来管理事务,只需要使用该模板类即可!!

 

2. 手动编程方式的具体步骤如下:

    1. 步骤一:配置一个事务管理器,Spring使用PlatformTransactionManager接口来管理事务,所以咱们需要使用到他的实现类!!

        <!-- 配置事务管理器 -->

        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

            <property name="dataSource" ref="dataSource"/>

        </bean>

 

    2. 步骤二:配置事务管理的模板

        <!-- 配置事务管理的模板 -->

        <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">

            <property name="transactionManager" ref="transactionManager"/>

        </bean>

 

    3. 步骤三:在需要进行事务管理的类中,注入事务管理的模板

        <bean id="accountService" class="com.itheima.demo1.AccountServiceImpl">

            <property name="accountDao" ref="accountDao"/>

            <property name="transactionTemplate" ref="transactionTemplate"/>

        </bean>

 

    4. 步骤四:在业务层使用模板管理事务:

        // 注入事务模板对象

        private TransactionTemplate transactionTemplate;

        public void setTransactionTemplate(TransactionTemplate transactionTemplate) {

            this.transactionTemplate = transactionTemplate;

        }

 

        public void pay(final String out, final String in, final double money) {

            transactionTemplate.execute(new TransactionCallbackWithoutResult() {

 

                protected void doInTransactionWithoutResult(TransactionStatus status) {

                    // 扣钱

                    accountDao.outMoney(out, money);

                    int a = 10/0;

                    // 加钱

                    accountDao.inMoney(in, money);

                }

            });

        }

1.3.2      声明式事务管理(重点)

声明式事务管理又分成两种方式

    * 基于AspectJ的XML方式(重点掌握)

    * 基于AspectJ的注解方式(重点掌握)

1.4       事务管理之基于AspectJ的XML方式(重点掌握)

准备转账环境:

***业务层:

       ***AccountService

       ***AccountServiceImpl

 技术分享图片

 

 

***持久层:

       ***AccountDao

       ***AccountDaoImpl

***spring配置:

 技术分享图片

 

 

***单元测试代码:

 技术分享图片

 

 

 

***配置事务管理的AOP

       ***平台事务管理器:DataSourceTransactionManager

 技术分享图片

 

 

       ***事务通知:<tx:advice id=”” transaction-manager=””/>

 技术分享图片

 

 

       ***AOP配置:

              <aop:config>

                     <aop:advisor advice-ref=”” pointcut=””/>

              </aop:config>

 技术分享图片

 

 技术分享图片

 

 

1.5       事务管理之基于AspectJ的注解方式(重点掌握)

***service类上或者方法上加注解:

       ***类上加@Transactional:表示该类中所有的方法都被事务管理

       ***方法上加@Transactional:表示只有该方法被事务管理

***开启事务注解:

 

14 Spring 应用之事务支持

原文:https://www.cnblogs.com/jingzhi-sksk/p/12864643.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!