首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【SSM_04】Spring-事务

【SSM_04】Spring-事务

作者头像
用户8250147
发布2021-02-04 10:49:25
发布2021-02-04 10:49:25
35800
代码可运行
举报
文章被收录于专栏:黑马黑马
运行总次数:0
代码可运行

一、Spring 事务控制

1. 编程式事务控制三大对象
代码语言:javascript
代码运行次数:0
运行
复制
① 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
代码运行次数:0
运行
复制
//导入相关依赖
<!-- 导入 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
代码运行次数:0
运行
复制
① 开启事务注解驱动
    * <tx:annotation-driven transaction-manager="transactionManager"/>
② 添加
    * @Transactional(isolation = Isolation.REPEATABLE_READ, 
                     propagation = Propagation.REQUIRED, 
                     timeout = 6, 
                     readOnly = false)
③ 注意    
    - 该注解可以作用于需要进行事务控制类或方法上
    - 当类和方法都有该注解时,采用就近原则
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Spring 事务控制
    • 1. 编程式事务控制三大对象
    • 2. 基于xml的声明式事务控制
    • 3. 基于注解的声明式事务控制
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档