• 在线客服

  • 扫描二维码
    下载博学谷APP

  • 扫描二维码
    关注博学谷微信公众号

  • 意见反馈

原创 声明式事务控制学习笔记整理

发布时间:2020-04-14 19:54:55 浏览 4270 来源:博学谷 作者:照照

    今天让我们走进声明式事务控制的学习,具体内容包括编程式事务控制相关对象,基于 XML 的声明式事务控制以及基于注解的声明式事务控制。对声明式事务控制感兴趣的同学,赶紧一起来看看小编整理的学习笔记吧!

     

    声明式事务控制

     

    一、编程式事务控制相关对象

     

    1PlatformTransactionManager 接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法。

     

    声明式事务控制

     

    2TransactionDefinition

     

    TransactionDefinition 是事务的定义信息对象,里面有如下方法:

     

    声明式事务控制

     

    1)事务隔离级别:设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读。

     

    2)事务传播行为

     

    REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)。

     

    SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)。

     

    MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。

     

    REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。

     

    NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

     

    NEVER:以非事务方式运行,如果当前存在事务,抛出异常。

     

    NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行 REQUIRED 类似的操作。

     

    超时时间:默认值是-1,没有超时限制。如果有,以秒为单位进行设置。

     

    是否只读:建议查询时设置为只读。

     

    3TransactionStatus

     

    TransactionStatus 接口提供的是事务具体的运行状态,方法介绍如下。

     

    声明式事务控制

     

    二、基于 XML 的声明式事务控制

     

    1、声明式事务控制是什么?

     

    Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中声明,用在 Spring 配置文件中声明式的处理事务来代替代码式的处理事务。它的作用是事务管理不侵入开发的组件。具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可。而且在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便。

     

    2、声明式事务控制的实现

     

    1)引入tx命名空间

     

    <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/context
           

    http://www.springframework.org/schema/context/spring-context.xsd
           

    http://www.springframework.org/schema/aop
           

    http://www.springframework.org/schema/aop/spring-aop.xsd
           

    http://www.springframework.org/schema/tx
           

    http://www.springframework.org/schema/tx/spring-tx.xsd
           

    http://www.springframework.org/schema/beans
           

    http://www.springframework.org/schema/beans/spring-beans.xsd">

     

    2)配置事务增强

     

    <!--平台事务管理器-->

     

    <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="*"/>

     

        </tx:attributes>

     

    </tx:advice>

     

    3)配置事务 AOP 织入

     

    <!--事务的aop增强-->

     

    <aop:config>

     

        <aop:pointcut id="myPointcut" expression="execution(* com.itheima.service.impl.*.*(..))"/>

     

        <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"></aop:advisor>

     

    </aop:config>

     

    4)测试事务控制转账业务代码

     

    @Override

     

    public void transfer(String outMan, String inMan, double money) {

     

        accountDao.out(outMan,money);

     

        int i = 1/0;
     

       accountDao.in(inMan,money);

     

    }

     

    三、基于注解的声明式事务控制

     

    1、注解配置声明式事务控制

     

    1)编写 AccoutDao

     

    @Repository("accountDao")

     

    public class AccountDaoImpl implements AccountDao {

     

        @Autowired

     

        private JdbcTemplate jdbcTemplate;

     

        public void out(String outMan, double money) {

     

            jdbcTemplate.update("update account set money=money-? where name=?",money,outMan);

     

        }

     

        public void in(String inMan, double money) {

     

            jdbcTemplate.update("update account set money=money+? where name=?",money,inMan);

     

        }

     

    }

     

    2)编写 AccoutService

     

    @Service("accountService")

     

    @Transactional

     

    public class AccountServiceImpl implements AccountService {

     

        @Autowired

     

        private AccountDao accountDao;

     

        @Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)

     

        public void transfer(String outMan, String inMan, double money) {

     

            accountDao.out(outMan,money);

     

            int i = 1/0;

     

            accountDao.in(inMan,money);

     

        }

     

    }

     

    3)编写 applicationContext.xml 配置文件

     

    <!—之前省略datsSourcejdbcTemplate、平台事务管理器的配置-->

     

    <!--组件扫描-->

     

    <context:component-scan base-package="com.itheima"/>

     

    <!--事务的注解驱动-->

     

    <tx:annotation-driven/>

     

    以上就是声明式事务控制的学习笔记整理,如果大家还有什么不懂的地方,可以上博学谷报名JavaEE在线就业班,有线上的老师为大家提供一对一的辅导答疑,现在就去体验试听课程吧~

     

    申请免费试学名额    

在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!

上一篇: Spring JdbcTemplate基本使用详解 下一篇: Java程序员Dubbo面试题整理附答案

相关推荐 更多

热门文章

  • 前端是什么
  • 前端开发的工作职责
  • 前端开发需要会什么?先掌握这三大核心关键技术
  • 前端开发的工作方向有哪些?
  • 简历加分-4步写出HR想要的简历
  • 程序员如何突击面试?两大招带你拿下面试官
  • 程序员面试技巧
  • 架构师的厉害之处竟然是这……
  • 架构师书籍推荐
  • 懂了这些,才能成为架构师
  • 查看更多

扫描二维码,了解更多信息

博学谷二维码