【SSM_04】Spring-事务

2021-02-04 10:49:25 浏览数 (1)

一、Spring 事务控制

1. 编程式事务控制三大对象
代码语言:javascript复制
① PlatformTransactionManager:事务管理器的接口
    - 具体方法
           * TransactionStatus getTransaction(TransactionDefinition definition) 获取事务状态信息
           * void commit(TransactionStatus status) 提交事务
           * void rallback(TransactionStatus status) 回滚事务
    - 根据使用的方式不用,使用的实现类也不同
        * Spring JDBC / Mybatis  --->   DataSourceTransactionManager
        * Hibernate              --->   HibernateTransactionManager
        
② TransactionDefinition:定义了事务的相关属性
    - 具体方法    
        * String getName()              获取事务对象名称
        * int getIsolationLevel()       获取事务隔离级别
        * int getPropagationBehavior()  获取事务传播行为
        * int getTimeout()              获取事务超时时间
        * boolean isReadOnly()          获取事务是否只读
        # 注意
            * 读写型事务:增删改
            * 只读型事务:查
    - 事务隔离级别
        * ISOLATION_DEFAULT            默认,根据使用的数据库决定
        * ISOLATION_READ_UNCOMMITTED   读未提交
        * ISOLATION_READ_COMMITTED     读已提交
        * ISOLATION_REPEATABLE_READ    可重复读
        * ISOLATION_SERIALIZABLE       串行化
    - 事务的传播行为
        * REQUIRED【默认】:有事务就加入,没有事务就创建(增删改)
        * SUPPORTS:有事务就加入,没有事务就以非事务执行(查)
        ···
    - 超时时间
        * 默认为 -1 没有时间限制
        * 数值,以秒为单位
    - 是否只读事务【readOnly】
        * true        只读
        * false       读写
        
③ TransactionStatus:事务的状态【无法修改,既定事实】
    - 具体方法
        * void flush()               刷新事务
        * boolean hasSavepoint()     获取事务是否存在存储点
        * boolean isCompleted()      获取事务是否完成
        * boolean isNewTransaction() 获取事务是否为新的事务
        * boolean isRoolbackOnly()   获取事务是否回滚
        * void setRoolbackOnly()     设置事务回滚
2. 基于xml的声明式事务控制
代码语言:javascript复制
//导入相关依赖
<!-- 导入 jdbcTemplate 依赖 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.0.5.RELEASE</version>
</dependency>

<!-- 事务控制 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.0.5.RELEASE</version>
</dependency>

--------------------------------------------------------------------------

//引入 tx 命名空间
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/tx
                   http://www.springframework.org/schema/tx/spring-tx.xsd"

--------------------------------------------------------------------------

//配置
<!-- 配置平台事务管理器 -->
/*  
class根据使用的方式来决定实现类
底层使用 connection 来处理事务,所以需要注入 数据源  
*/
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSources"/>
</bean>

--------------------------------------------------------------------------

<!-- 通知事务增强 -->
/*
    tx:advice 
        指定唯一 id 标识
        指定 事务管理器 会默认寻找 id 为 transactionManager 的事务管理器

    tx:method
        name:指定需要被管理的方法名,* 为通配符
        isolation:事务隔离级别
        propagation:事务传播方式
        timeout:超时时间
        read-only:是否只读        
*/
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <!-- 设置事务属性信息 -->
    <tx:attributes>
        <tx:method name="test*" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="6" read-only="false"/>
    </tx:attributes>
</tx:advice>

--------------------------------------------------------------------------

<!-- 事务配置 aop 织入 -->
/*
    底层使用 aop 将事务与方法结合
    aop:advisor 事务特有的配置切面方式
*/
<aop:config>
    <aop:pointcut id="myPointcut" expression="execution(* com.softwareMan.service.impl.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"/>
</aop:config>
3. 基于注解的声明式事务控制
代码语言:javascript复制
① 开启事务注解驱动
    * <tx:annotation-driven transaction-manager="transactionManager"/>
② 添加
    * @Transactional(isolation = Isolation.REPEATABLE_READ, 
                     propagation = Propagation.REQUIRED, 
                     timeout = 6, 
                     readOnly = false)
③ 注意    
    - 该注解可以作用于需要进行事务控制类或方法上
    - 当类和方法都有该注解时,采用就近原则

0 人点赞