(九)Spring 事务开发、事务属性详解

持久层

目录

  • 事务回顾
  • Spring 控制事务的开发
  • Spring 中的事务属性(Transaction Attribute)
  • 隔离属性(ISOLATION)
  • 传播属性(PROPAGATION)
  • 只读属性(readOnly)
  • 超时属性(timeout)
  • 异常属性
  • 事务属性常见配置总结
  • 基于标签的事务配置方式

 

事务回顾

什么是事务?

  • 事务时保证业务操作完整性的一种数据库机制

事务的 4 大特点: ACID

  • A 原子性
  • C 一致性
  • I 隔离性
  • D 持久性

如何控制事务?(JDBC、Mybatis)
JDBC

  • Connection.setAutoCommit(false);
  • Connection.commit();
  • Connection.rollback();

Mybatis

  • Mybatis 自动开启事务
  • sqlSession.commit();,底层还是调用的 Connection
  • sqlSession.rollback();,底层还是调用的 Connection

结论:控制事务的底层,都是通过 Connection 对象完成的。

Spring 控制事务的开发

  • 搭建开发环境 pom.xml
<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.2.6.RELEASE</version>
</dependency>
  • 编码
<bean id="userService" class="com.yusael.service.UserServiceImpl"><property name="userDAO" ref="userDAO"/>
</bean><!--DataSourceTransactionManager-->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean>@Transactional
public class UserServiceImpl implements UserService {private UserDAO userDAO;<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
  • 细节
    进行动态代理底层实现的切换,默认 false 是 JDK,true 是 Cglib。
<tx:annotation-driven transaction-manager="dataSourceTransactionManager" proxy-target-class="true"/>

Spring 中的事务属性(Transaction Attribute)

什么是事务属性

属性:描述物体特征的一系列值(性别、身高、体重)

事务属性:描述事务特征的一系列值

  1. 隔离属性
  2. 传播属性
  3. 只读属性
  4. 超时属性
  5. 异常属性

如何添加事务属性?

@Transactional(isolation=, propagation=, readOnly=,timeout=,rollbackFor,noRollbackFor=,)

隔离属性(ISOLATION)

概念:描述了事务解决并发问题的特征

  1. 什么是并发?
    多个事务(用户)在同一时间,访问操作了相同的数据。
    同一时间:0.000 几秒左右
  2. 并发会产生那些问题?
    • 脏读
    • 不可重复读
    • 幻影读
  3. 并发问题如何解决?
    通过隔离属性解决,隔离属性中设置不同过的值,解决并发处理的过程中的问题。

事务并发产生的问题:

  • 脏读
    一个事务,读取了另一个事务中没有提交的数据,会在本事务中产生数据不一样的现象
    解决方案:@Transaction(isolation=Isolation.READ_COMMITTED)
  • 不可重复读
    一个事务中,多次读取相同的数据,但是读取结果不一样,会在本事务中产生数据不一样的现象
    注意:1.不是脏读 2.在一个事务中
    解决方案:@Transaction(isolation=Isolation.REPEATABLE_READ)
    本质:一把行锁(对数据库表的某一行加锁)
  • 幻影读
    一个事务中,多次对整表进行查询统计,但是结果不一样,会在本事务中产生数据不一致的问题
    解决方案:@Transaction(isolation=Isolation.SERIALIZABLE)
    本质:表锁(对数据库某个表加锁)

安全与效率对比:

  • 并发安全:SERIALIZABLE > READ_ONLY > READ_COMMITTED
  • 运行效率:READ_COMMITTED > READ_ONLY > SERIALIZABLE

数据库对隔离属性的支持:

隔离属性的值MySQLOracle
ISOLATION_READ_COMMITTED支持支持
ISOLATION_REPEATABLE_READ支持不支持
ISOLATION_SERIALIZABLE支持支持hi
  • Oracle 不支持 REPEATABLE_READ,那该如何解决不可重复读?
    采用 多版本比对 的方式解决不可重复读问题。

默认的隔离属性

  • Spring 会指定为 ISOLATION_DEFAULT,调用不同数据库所设置的默认隔离属性
    MySQL:REPEATABLE_READ
    Oracle:READ_COMMITTED
  • 查看数据库的默认隔离属性:
    MySQL:SELECT @@tx_isolation;
    Oracle:较麻烦,建议百度。

隔离属性在实验中的建议

  • 推荐使用 Spring 默认指定的 ISOLATION_DEFAULT
  • 未来的实战中,遇到并发访问的情况,很少见
  • 如果真的遇到并发问题,解决方案:乐观锁
    Hibernate(JPA):version
    MyBatis:通过拦截器自定义开发

传播属性(PROPAGATION)

概念:描述了事务解决 嵌套 问题 的特征。

事务的嵌套:指的是一个大的事务中,包含了若干个小的事务。

事务嵌套产生的问题: 大事务中融入了很多小的事务,他们彼此影响,最终就导致外部大的事务丧失了事务的原子性。

传播属性的值及其用法:

传播属性的值外部不存在事务外部存在事务用法备注
REQUIRED开启新的事务融合到外部事务中@Transactional(propagation = Propagation.REQUIRED)增、删、改方法
SUPPORTS不开启事务融合到外部事务中@Transactional(propagation = Propagation.SUPPORTS)查询方法
REQUIRES_NEW开启新的事务挂起外部事务,创建新的事务@Transactional(propagation = Propagation.REQUIRES_NEW)日志记录方法中
NOT_SUPPORTED不开启事务挂起外部事务@Transactional(propagation = Propagation.NOT_SUPPORTED)极其不常用
NEVER不开启事务抛出异常@Transactional(propagation = Propagation.NEVER)极其不常用
MANDATORY抛出异常融合到外部事物中@Transactional(propagation = Propagation.MANDATORY)极其不常用

Spring 中传播属性的默认值是:REQUIRED

推荐传播属性的使用方式:

  • 增删改 方法:使用默认值 REQUIRED
  • 查询 方法:显示指定传播属性的值为 SUPPORTS

只读属性(readOnly)

针对于 只进行查询操作的业务方法,可以加入只读属性,提高运行效率。
默认值:false

@Transactional(readOnly = true)

超时属性(timeout)

指定了事务等待的最长时间。

  1. 为什么事务会进行等待?
    当前事务访问数据时,有可能访问的数据被别的事务进行加锁的处理,那么此时本事务就必须进行等待。
  2. 等待时间,单位是 
  3. 如何使用:@Transactional(timeout = 2)
  4. 超时属性的默认值:-1
    -1 表示超时属性由对应的数据库来指定(一般不会主动指定,-1 即可)

异常属性

Spring 事务处理过程中:

  • 默认对于 RuntimeException 及其子类,采用 回滚 的策略。
  • 默认对于 Exception 及其子类,采用 提交 的策略。

使用方法:

@Transactional(rollbackFor = java.lang.Exception.class, xxx, xxx)@Transactional(noRollbackFor = java.lang.RuntimeException, xxx, xxx)

建议:实战中使用 RuntimeException 及其子类,使用事务异常属性的默认值。

事务属性常见配置总结

  1. 隔离属性 默认值
  2. 传播属性 Required(默认值)增删改、Supports 查询操作
  3. 只读属性 readOnly=false 增删改,true 查询操作
  4. 超时属性 默认值 -1
  5. 异常属性 默认值

增删改操作:@Transactional
查询操作:@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)

基于标签的事务配置方式

基于注解 @Transaction 的事务配置回顾:

<bean id="userService" class="com.yusael.service.UserServiceImpl"><property name="userDAO" ref="userDAO"/>
</bean><!--DataSourceTransactionManager-->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean>@Transactional
public class UserServiceImpl implements UserService {private UserDAO userDAO;<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>

基于标签的事务配置:

<!--DataSourceTransactionManager-->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean><tx:advice id="txAdvice" transaction-manager="dataSourceTransactionManager"><tx:attributes><tx:method name="register" isolation="DEFAULT" propagation="REQUIRED"/></tx:attributes>
</tx:advice><aop:config><aop:pointcut id="pc" expression="execution(* com.yusael.service.UserServiceImpl.register(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
</aop:config>

基于标签的事务配置在 实战 中的应用方式:


<tx:advice id="txAdvice" transaction-manager="dataSourceTransactionManager"><tx:attributes><tx:method name="register"/><tx:method name="modify*"/>编程时候, service中负责进行增删改操作的方法 都以 modify 开头查询操作 命名无所谓<tx:method name="*" propagation="SUPPORTS" read-only="true"/></tx:attributes>
</tx:advice><aop:config><aop:pointcut id="pc" expression="execution(* com.yusael.service..*.*(..))"/>应用的过程中, 将 service 都放到 service 包下<aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
</aop:config>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于百度理解与交互技术实现机器问答

一、前言我们都知道现在聊天对话机器是一个很有意思的东西&#xff0c;比如说苹果siri&#xff0c;比如说微软的小冰。聊天对话机器的应用场景也很广泛&#xff0c;比如说&#xff1a;银行的自助办卡机器人、展会讲解解说等等。我们对机器人说句话&#xff0c;机器人从听取&…

Spark入门(十七)之单表关联

一、单表关联 给出child-parent&#xff08;孩子——父母&#xff09;表&#xff0c;要求输出grandchild-grandparent&#xff08;孙子——祖父母&#xff09;表 二、maven设置 <?xml version"1.0" encoding"UTF-8"?><project xmlns"htt…

P3514-[POI2011]LIZ-Lollipop【思路题】

正题 题目链接:https://www.luogu.org/problemnew/show/P3514 题目大意 一个12序列&#xff0c;若干个询问求有没有一个子串之和为kkk 解题思路 首先感谢ZYCdalaoZYCdalaoZYCdalao的温馨提示。 然后进入正题 首先我们考虑一个串的和为kkk 那么最边的数的情况(1,1),(1,2),(2…

(十)Spring 与 MVC 框架整合

Spring 整合 MVC 目录 MVC 框架整合思想为什么要整合 MVC 框架搭建 Web 运行环境Spring 整合 MVC 框架的核心思路1. 准备工厂2. 代码整合Spring 整合 Struts2MVC 框架整合思想 为什么要整合 MVC 框架 MVC 框架提供了控制器&#xff08;Controller&#xff09;调用 Servlet …

Spark入门(十八)之多表关联

一、多表关联 输入是两个文件&#xff0c;一个代表工厂表&#xff0c;包含工厂名列和地址编号列&#xff1b;另一个代表地址表&#xff0c;包含地址名列和地址编号列。要求从输入数据中找出工厂名和地址名的对应关系&#xff0c;输出"工厂名——地址名"表 二、maven…

利用VSTS跟Kubernetes整合进行CI/CD

为什么VSTS要搭配Kubernetes&#xff1f;通常我们在开发管理软件项目的时候都会碰到一个很头痛的问题&#xff0c;就是开发、测试、生产环境不一致&#xff0c;导致开发人员和测试人员甚至和运维吵架。因为常见的物理环境甚至云环境中&#xff0c;这些部署环境都是由运维人员提…

P3112-[USACO14DEC]后卫马克Guard Mark【贪心】

正题 题目链接:https://www.luogu.org/problemnew/show/P3112 题目大意 有nnn只牛&#xff0c;每只牛有hi,wi,sih_i,w_i,s_ihi​,wi​,si​分别表示有多高&#xff0c;有多重&#xff0c;上面最多承载总共多重的牛。 选择一些牛依次摆放要求高度超过TTT且上面还能增加最重的物…

(十一)Spring 基础注解(对象创建相关注解、注入相关注解)

注解编程 目录 注解基础概念注解的作用Spring 注解的发展历程Spring 基础注解&#xff08;Spring 2.x&#xff09;对象创建相关注解ComponentRepository、Service、ContollerScopeLazy生命周期注解 PostConstruct、PreDestroy注入相关注解用户自定义类型 AutowiredJDK 类型注…

Spark Streaming之统计socket单词数

一、统计socket单词数 侦听TCP套接字的数据服务器接收到的文本数据中的单词数。 二、maven配置 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/…

使用 ASP.NET Core, Entity Framework Core 和 ABP 创建N层Web应用 第二篇

介绍这是“使用 ASP.NET Core &#xff0c;Entity Framework Core 和 ASP.NET Boilerplate 创建N层 Web 应用”系列文章的第二篇。以下可以看其他篇目&#xff1a;使用 ASP.NET Core &#xff0c;Entity Framework Core 和 ASP.NET Boilerplate 创建N层 Web 应用 第一篇 &…

jzoj4786-[NOIP2016提高A组模拟9.17]小a的强迫症【数论】

正题 题目大意 nnn个颜色第iii个个数为numinum_inumi​个&#xff0c;然后要求第iii种颜色的最后一个一定在第i1i1i1种的最后一个前面。求方案总数。 解题思路 首先先定义一个1∼n1\sim n1∼n的序列&#xff0c;然后依次将剩下的数插入。 第iii个颜色有z(∑j1i−1numj)1z(\su…

0-MyBatis简介

MyBatis简介 目录 简介MyBatis 历史MyBatis特点为什么要使用 MyBatis&#xff1f;JDBC 缺点Hibernate 缺点MyBatis简介 MyBatis 历史 MyBatis 原是 apache 的一个开源项目 iBatis&#xff1b;2010年6月这个项目由 apache software foundation 迁移到了 google code&#xf…

揭秘微软6万工程师DevOps成功转型的技术「武器」

在微软&#xff0c;通过其自身数年的 DevOps 转型&#xff0c; 6 万名工程师实现了更好的软件平台创新和快速迭代。微软有庞大的技术产品矩阵&#xff0c;同时也具有每天发布的能力&#xff0c;其中&#xff0c;微软研发云是支撑整个开发过程与运维最重要的基础平台。微软研发云…

jzoj4787-[NOIP2016提高A组模拟9.17]数格子【矩阵乘法】

正题 题目大意 求121\times 212的方块铺满4n4\times n4n的方格方案总数。 解题思路 首先 当计算fnf_nfn​时&#xff0c; 显然最后一排可以(−−−−)(∣∣∣∣)(−−∣∣)(∣−−∣)(∣∣−−)(--\ --)(|\ \ |\ \ |\ \ |)(--\ \ |\ \ |)(|\ \ --\ \ |)(|\ \ |--)(−− −−)…

Flowable学习笔记(一、入门)

转载自 Flowable学习笔记&#xff08;一、入门&#xff09; 一、Flowable简介 1、Flowable是什么 Flowable是一个使用Java编写的轻量级业务流程引擎。Flowable流程引擎可用于部署BPMN 2.0流程定义&#xff08;用于定义流程的行业XML标准&#xff09;&#xff0c; 创建这些流…

01-MyBatis入门程序

MyBatis入门程序 目录 1. 下载 Mybatis 核心包2. 创建工程&#xff0c;引入 MyBatis 核心包及依赖包3. 创建 customer 表&#xff0c;建立与表对应的 domain使用 lombok&#xff0c;开启注解创建 Customer 类4. 创建 MyBatis 核心配置文件 SqlMappingConfig.xml5. 创建表对象…

角落的开发工具集之Vs(Visual Studio)2017插件推荐

“ 工具善其事&#xff0c;必先利其器&#xff01;装好这些插件让vs更上一层楼”因为最近录制视频的缘故&#xff0c;很多朋友都在QQ群留言&#xff0c;或者微信公众号私信我&#xff0c;问我一些工具和一些插件啊&#xff0c;怎么使用的啊&#xff1f;那么今天我忙里偷闲整理一…

jzoj4788-[NOIP2016提高A组模拟9.17]序列【差分,贪心】

正题 题目大意 一个序列AAA可以每次选择一段区间(Ai1)%4(i∈[l..r])(A_{i}1)\%4(i\in [l..r])(Ai​1)%4(i∈[l..r])。求最少次数使其变成BBB序列。 解题思路 先计算出每个数字最少加多少可以变成目标数字记录入aaa数组。 然后若不考虑一个数要取模多次的话答案就是 ∑i1nmax…

02-MyBatis配置SQL打印

MyBatis 配置SQL打印 在 SqlMappingConfig.xml 中配置以下代码&#xff1a; <!--配置sql打印--> <settings><setting name"logImpl" value"STDOUT_LOGGING"/> </settings>运行效果&#xff1a;会显示 SQL 语句&#xff0c;查询结…

Flowable学习笔记(二、BPMN 2.0-基础 )

转载自 Flowable学习笔记&#xff08;二、BPMN 2.0-基础 &#xff09; 1、BPMN简介 业务流程模型和标记法&#xff08;BPMN, Business Process Model and Notation&#xff09;是一套图形化表示法&#xff0c;用于以业务流程模型详细说明各种业务流程。 它最初由业务流程管理…