文档章节

【SSM_04】Spring-事务

Demo_Null
 Demo_Null
发布于 02/15 15:34
字数 767
阅读 87
收藏 0

一、Spring 事务控制

1. 编程式事务控制三大对象

① 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的声明式事务控制

//导入相关依赖
<!-- 导入 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. 基于注解的声明式事务控制

① 开启事务注解驱动
    * <tx:annotation-driven transaction-manager="transactionManager"/>
② 添加
    * @Transactional(isolation = Isolation.REPEATABLE_READ, 
                     propagation = Propagation.REQUIRED, 
                     timeout = 6, 
                     readOnly = false)
③ 注意    
    - 该注解可以作用于需要进行事务控制类或方法上
    - 当类和方法都有该注解时,采用就近原则

© 著作权归作者所有

Demo_Null

Demo_Null

粉丝 1
博文 65
码字总数 68605
作品 0
深圳
私信 提问
加载中

评论(0)

Spring 事务管理高级应用难点剖析: 第 1 部分

Spring 最成功,最吸引人的地方莫过于轻量级的声明式事务管理,仅此一点,它就宣告了重量级 EJB 容器的覆灭。Spring 声明式事务管理将开发者从繁复的事务管理代码中解脱出来,专注于业务逻辑...

红薯
2010/03/28
1K
2
Spring的事务管理难点剖析(3):事务方法嵌套调用的迷茫

Spring事务传播机制回顾 Spring事务一个被讹传很广说法是:一个事务方法不应该调用另一个事务方法,否则将产生两个事务。结果造成开发人员在设计事务方法时束手束脚,生怕一不小心就踩到地雷...

icheer
2012/07/17
181
0
day35_Spring学习笔记_03

一、事务管理 1.1、回顾事务 事务:一组业务操作ABCD,要么全部成功,要么全部不成功。 特性:ACID 原子性:整体 一致性:完成 隔离性:并发 持久性:结果 隔离问题: 脏读:一个事务读到另一...

黑泽明军
2018/08/08
0
0
Spring的事务管理实现原理初探

这里主要是通过分析部分源码进行剖析Spring事务管理的实现原理。 再分析源码前,现从理论上大概分析哈: 纯JDBC操作数据库的基本步骤: 1. 获取连接 Connection conn = DriverManager.getCon...

rockypeng
2014/01/19
0
0
mybatis-spring事务处理机制分析

Spring官方并没有提供对MyBatis的集成方案,于是MyBatis项目组自己写了一个项目mybatis-spring专门用于在spring中使用MyBatis。 mybatis-spring的实现很大程度上依赖spring jdbc的事务管理,...

fifadxj
2016/11/10
3K
2

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周三乱弹 —— 提高不了工作效率和脸有关系

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 1 《夏令时记录(piano.ver)》- ゆめこ 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
今天
67
2
List的一波操作

public static void main(String[] args) { List<Entity> list = new ArrayList<>(); list.add(new Entity(1)); list.add(new Entity(2)); list.add(new Entity(3)); ......

那个猩猩很亮
今天
75
0
Spring基础

主要用于service层; 轻量级java开发框架; 各层 web层:struts,spring-MVC service层:spring dao层:hibernate,mybatis , jdbcTemplate --> spring-data Spring核心:控制反转IOC 切面编...

七宝1
今天
30
0
解决overflow+border-radius+transform圆角问题

网上还有其他版本,但是对我来说都不好使,下面是我在Chrome上的代码。overflow:hidden依然是不能正常使用,换成unset就可以,读者如果有更好的解决方案,请留言,谢谢。 <figure> <img...

hi懒喵
今天
53
0
《C语言》—— 数组

书籍使我变成了一个幸福的人,使我的生活变成轻松而舒适的诗。——高尔基 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 点关注,不迷路!...

龙跃十二
今天
84
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部