zoukankan      html  css  js  c++  java
  • Spring 中事务控制的 API 介绍

    PlatformTransactionManager

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

    // 获取食物状态信息
    TransactionStatus getTransaction(TransactionDefinition definition)
    
    // 提交事务
    void commit(TransactionStatus status)
    
    // 回滚事务
    void rollback(TransactionStatus status)
    

    PlatformTransactionManager 的常用实现类

    org.springframework.jdbc.datasource.DataSourceTransactionManager
    // 使用 Spring JDBC 或 iBatis 进行持久化数据时使用
    
    org.springframework.orm.hibernate5.HibernateTransactionManager
    // 使用 Hibernate 版本进行持久化数据时使用
    

    TransactionDefinition

    TransactionDefinition 是事务的定义信息对象

    // 获取事务对象名称
    String getName()
    
    // 获取事务隔离级
    int getlsolationLevel()
    
    // 获取事务传播行为
    int getPropagationBehavior()
    
    // 获取事务超时时间
    int getTimeout()
    
    // 获取事务是否只读
    boolean isReadOnly()
    

    事务的隔离级别

    事务隔离级反映事务提交并发访问时的处理态度

    ISOLATION_DEFAULT
    // 默认级别,归属下列某一-种
    
    ISOLATION_READ_UNCOMMITTED
    // 可以读取未提交数据
    
    ISOLATION_READ_COMMITTED
    // 只能读取已提交数据,解决脏读问题(Oracle默认级别)
    
    ISOLATION_REPEATABLE_READ
    // 是否读取其他事务提交修改后的数据,解决不可重复读问题(MySQL默认级别)
    
    ISOLATION_SERIALIZABLE
    // 是否读取其他事务提交添加后的数据,解决幻影读问题
    

    事务的传播行为

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

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

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

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

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

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

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

    超时时间

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

    是否是只读事务

    建议查询时设置为只读。

    TransactionStatus

    TransactionStatus 接口提供的是事务具体的运行状态

    // 刷新事务
    void flush()
    
    // 获取是否是否存在存储点
    boolean hasSavepoint()
    
    // 获取事务是否完成
    boolean isCompleted()
    
    // 获取事务是否为新的事务
    boolean isNewTransaction()
    
    // 获取事务是否回滚
    boolean isRollbackOnly()
    
    // 设置事务回滚
    void setRollbackOnly()
    

    基于 XML 的声明式事务控制(配置方式)

    spring 的配置文件约束

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring -beans.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring -aop.xsd">
    </beans>
    

    配置事务管理器

    <bean id="事务管理器唯一标识" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" />
    

    配置事务的通知引用事务管理器

    <tx:advice id="事务通知唯一标识" transaction-manager="事务管理器">
    

    配置事务的属性

    1. <tx:advice> 标签内部配置事务的属性
    2. <tx:attributes> 配置事务的属性
    3. <tx:method> 指定方法名称:是业务核心方法
      • 属性值
        1. read-only:是否是只读事务。默认 false,不只读。
        2. isolation:指定事务的隔离级别。默认值是使用数据库的默认隔离级别。
        3. propagation:指定事务的传播行为。
        4. timeout:指定超时时间。默认值为:-1。永不超时。
        5. rollback-for:用于指定一个异常,当执行产生该异常时,事务回滚。产生其他异常,事务不回滚。没有默认值,任何异常都回滚。
        6. no-rollback-for :用于指定一个异常, 当产生该异常时, 事务不回滚, 产生其他异常时, 事务回滚。没有默认值,任何异常都回滚。

    基于注解的配置方式

    spring 的配置文件约束

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring -beans.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/context
            http://www.springframework.org/schema/context/spring -context.xsd">
    </beans>
    

    在业务层使用 @Transactional 注解

    @Transactional 注解 类似于<tx:method>,指定类,配置事务的属性

    @Service("serviceDemo")
    @Transactional(readOnly=true,propagation=Propagation.SUPPORTS)
    // propagation 属性指定事务的传播行为。
    // readOnly 属性说明是否是只读事务
    public class ServiceDemo() {
        ... ...
    }
    

    参考文献

    1. 黑马 Java
    Good Good Write Bug, Day Day Up
  • 相关阅读:
    【音视频】视频质量测试方向-标准
    解决苹果提审,APP Store看不到自家的App!!!
    【音视频】自研直播推流-流程概览
    【PyCharm】破解+汉化,一劳永逸
    jmeter+ant+jenkins 搭建接口自动化测试
    jenkins部署
    ruby File类
    ant + jmeter 自动化接口测试环境部署
    jmeter 插件安装
    ruby Logger日志
  • 原文地址:https://www.cnblogs.com/liyihua/p/14482463.html
Copyright © 2011-2022 走看看