zoukankan      html  css  js  c++  java
  • 《Spring实战 第3版》—第6章

    《第六章 事务管理》

    在软件开发领域,全有或者全无的操作被称为事务。
    事务允许你将几个操作组合合成一个要么全部发生要么全部不发生的工作单元

    理解事务

    在传统的软件开发中,人们创建了一个属于来描述事务:ACID
    简单来说,ACID表示4个特性

    1. 原子性(Atomic):
      • 原子性确保事务中的所有操作全部发生或者全部不发生
    2. 一致性(Consistent):
      • 一旦事务完成(不论是成功还是失败),系统必须确保它所建模的业务处于一致的状态
      • 现实的数据不应该被破坏
    3. 隔离性(Isolated):
      • 事务允许多个用户对相同的数据进行操作,每个用户的操作不会与其他用户纠缠在一起
      • 因此,事务应该被彼此隔离,避免发生同步读写相同数据的事情
    4. 持久性(Durable):
      • 一旦事务完成,事务的结果应该持久化,这样就能从任何的系统崩溃中恢复过来
    1.理解Spring对事务管理的支持

    Spring提供了对编码式和声明式事务的支持
    编码式事务允许用户在代码中精确定义事务的边界
    声明式事务(基于AOP)有助于用户将操作与事务规则进行解耦

    无论是选择将事务编码到Bean中还是选择将其定义为切面
    都需要使用Spring的事务管理器与平台相关的事务进行交互

    选择事务管理器

    Spring并不直接管理事务,而是提供了多种事务管理器
    它们将事务管理的职责委托给JTA或其他持久化机制所提供的平台相关的事务实现

    为了使用事务管理器,需要将其声明在应用程序上下文中

    1.JDBC事务

    如果在应用程序中直接使用JDBC持久化,DataSourceTransactionManager会为你处理事务边界
    为了使用DataSourceTransactionManage需要将其装配到XML文件中:

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

    在幕后,DataSourceTransactionManager通过调用java.sql.Connection来管理事务
    java.sql.Connection是通过DataSource获取到的
    然后通过调用commit()方法来提交事务
    同样,事务失败时通过调用rollback()方法进行回滚

    声明式事务

    Spring对声明式事务的支持是通过使用Spring AOP框架实现的
    这是因为事务是在应用程序之上的系统级服务

    1.定义事务属性

    在Spring中,声明式事务是通过事务属性来定义的
    事务属性描述了事务策略如何应用到方法上
    事务属性包含了5个方面:

    1. 传播行为
    2. 隔离级别
    3. 只读
    4. 事务超时
    5. 回滚规则

    尽管Spring提供了多种声明式事务的机制
    但是所有的方式都依赖着5个参数来控制如何管理事务策略
    因此,有必要了解这5个参数
    传播行为
    事务的第一个方面是传播行为
    它定义了客户端与被调用方法之间的事务边界

    传播行为回答了这样一个问题,即新的事务应该被启动还是被挂起,或者方法是否要在事务环境中运行
    传播规则定义了何时要创建一个事务或何时使用已有的事务

    隔离级别
    声明式事务的第二个维度就是隔离级别
    隔离级别定义了一个事务可能受其他并发事务影响的程度

    在典型应用程序中,多个事务并发运行
    经常会操作相同的数据来完成各自的任务
    但会导致脏读、不可重复读等问题

    在理想情况下,事务之间是完全隔离的,从而防止这些问题的产生
    但是完全的隔离会导致性能问题,因此就有了多种隔离级别
    隔离级别决定了一个事务会被其它并行的事务所能影响的程度

    只读
    声明式事务的第三个特性是它是否为只读事务
    如果事务只对后端的数据库进行读操作,数据库可以利用事务的只读特性来进行一些优化
    事务超时
    为了是程序很好的运行,事务不能运行太长的时间
    事务的第四个特性就是超时
    可以声明一个事务,在特定的秒数后自动回滚,而不是等待其结束
    回滚规则
    事务的第五个特性是回滚规则
    这些规则定义了哪些异常会导致事务回滚而哪些不会

    2.在XML中定义事务

    Spring提供了一个tx配置命名空间,借助它可以极大地简化Spring中的声明式事务
    因此,先引入tx命名空间xmlns:tx="http://www.springframework.org/schema/tx"

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    

    transaction-manager定义了一个事务管理器
    <tx:advice>假定事务管理器被声明为一个id为transactionManager的Bean
    如果碰巧事务管理器配置了一个不同的id,则需要在transaction-manager属性明确指定事务管理器的id

    对于<tx:advice>来说,事务属性定义在<tx:attribute>元素中,该元素包含了一个或者多个的<tx:method>元素
    <tx:method>元素为某个name属性指定的方法定义事务参数

    在txAdvice事务通知定义中,所配置的事务性方法被分成了两类:名称save打头的方法和其他方法
    以save打头的方法的propagation——传播行为被定义为REQUIRED
    而其他方法的propagation被定义为SUPPORTS,并且为只读

    <tx:advice>只是定义了AOP通知,用于把事务边界通知给方法
    我们声明哪些Bean应该被通知——我们需要一个切点来做这件事
    为了完整定以事务性切面,我们必须定义一个通知器(advisor)

    <aop:config>
        <aop:advisor pointcut="execution(* *..UserDAO.*(..))" 
                     advice-ref="txAdvice"/>
    </aop:config>
    

    这里的pointcut属性使用了AspectJ切入点表达式来表明通知器适用于UserDAO接口的所有方法
    接口中的哪些方法应该真正运行在事务中以及方法的事务属性都是有这个事务通知来定义的
    事务通知是由advise-ref属性指定的,它引用了名为txAdvice的通知

    3.定义注解驱动的事务

    使用注解能进一步简化对事务的声明
    此时,只需要在Spring上下文中添加一行XML,即可声明事务
    <tx:annotation-driven transaction-manager="transactionManager">
    这样就完成了对事务的声明

    注解允许在代码上直接定义元数据而不是在外部的配置文件中
    <tx:annotation-driven>元素告诉Spring检查上下文中所有的Bean并查找使用@Transactional注解的Bean
    不管这个注解是在类级别上还是在方法级别上

    对于每一个使用@Transactional注解的Bean,<tx:annotation-driven>会自动为它添加事务通知
    通知的事务是通过@Transactional注解的参数来定义的
    @Transactional(propagation = Propagation.REQUIRED,readOnly = false)

  • 相关阅读:
    Inno Setup入门(十三)——Pascal脚本(2)
    Inno Setup入门(十二)——Pascal脚本(1)
    Inno Setup入门(十一)——完成安装后执行某些程序
    Inno Setup入门(一)——最简单的安装脚本
    用现代化的方式开发一个图片上传工具
    现在就可以使用的5个 ES6 特性
    PhantomJS 基础及示例
    jquery获取css颜色值返回RGB应用
    Javascript常见设计模式解析
    更合理的 setState()
  • 原文地址:https://www.cnblogs.com/ASE265/p/12487304.html
Copyright © 2011-2022 走看看