20191105 《Spring5高级编程》笔记-第9章
第9章 事务管理
一些名词:
- 2PC(2 Phase Commit)
- XA协议
- JTS(Java Transaction Service)
- JCA(Java EE Connector Architecture)
- JPA(Java Persistence API)
- JPQL(Java Persistence Query Language)
Spring支持声明式和编程式事务管理。
9.1 研究Spring事务抽象层
在使用事务时,必须选择是使用全局事务(分布式事务)还是本地事务。本地事务特定于单个事务资源(例如,JDBC连接),而全局事务由容器管理并且可以跨越多个事务资源。
使用JTA实现的全局事务的高级视图:
9.2 PlatformTransactionManager
的实现
org.springframework.transaction.PlatformTransactionManager
接口使用 TransactionDefinition
和 TransactionStatus
接口来创建和管理事务。
9.3 分析事务属性
事务的四个属性:ACID
(原子性、一致性、隔离性、持久性)。对事务的原子性、一致性和持久性是无法控制的(或者说由数据库控制)。但是,可以控制事务的传播和超时,以及配置事务是否应为制度并指定隔离级别。
Spring将以上事务的设置封装在TransactionDefinition
接口中。该接口被用于Spring的事务支持的核心接口,即PlatformTransactionManager
接口,该接口的实现在特定平台(如JDBC或JTA)上执行事务管理。其核心方法PlatformTransactionManager.getTransaction(TransactionDefinition definition)
将TransactionDefinition
作为参数,并返回一个TransactionStatus
接口。TransactionStatus
接口用于控制事务执行,即设置事务结果并检查事务是否完成或是否为新事务。
9.3.1 TransactionDefinition
接口
TransactionDefinition
接口控制事务的属性。
TransactionDefinition.getIsolationLevel()
返回事务隔离级别:
TransactionDefinition.getIsolationLevel()
返回事务传播类型:
9.3.2 TransactionStatus
接口
TransactionStatus
接口允许事务管理器控制事务的执行。
TransactionStatus.setRollbackOnly()
会导致回滚并结束活动事务。
9.4 示例代码的示例数据模型和基础结构
9.4.2 示例数据模型和通用类
org.springframework.transaction.annotation.Transactional
@Transactional
注解的属性:
Spring的JpaTransactionManager
不支持自定义隔离级别。它总是使用底层数据存储的默认隔离级别。如果使用Hibernate作为JPA服务提供程序,可以扩展HibernateJpaDialect
类以支持自定义隔离级别。
9.4.3 使用AOP配置进行事务管理
引入注解之后,在XML中使用AOP名称空间配置基本被弃用了,但是在无法对代码编辑的情况下是很有用的。
9.5 使用编程式事务
编程式事务有两种选择,第一种是将一个PlatformTransactionManager
实例注入到bean中,并直接与事务管理器进行交互。第二种选择是使用Spring提供的org.springframework.transaction.support.TransactionTemplate
类。
在一般情况下建议使用声明式事务。
9.6 使用Spring实现全局事务
在Java中,JTA是实现全局事务的事实标准。
和本地事务一样,Spring支持JTA事务,并从业务代码中隐藏相关逻辑。
9.6.3 Spring Boot JTA
<!--JTA-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
20191105 《Spring5高级编程》笔记-第9章的更多相关文章
- C#高级编程笔记之第二章:核心C#
变量的初始化和作用域 C#的预定义数据类型 流控制 枚举 名称空间 预处理命令 C#编程的推荐规则和约定 变量的初始化和作用域 初始化 C#有两个方法可以一确保变量在使用前进行了初始化: 变量是字段, ...
- C#高级编程笔记之第一章:.NET体系结构
1.1 C#与.NET的关系 C#不能孤立地使用,必须与.NET Framework一起使用一起考虑. (1)C#的体系结构和方法论反映了.NET基础方法论. (2)多数情况下,C#的特定语言功能取决 ...
- 20191105 《Spring5高级编程》笔记-【目录】
背景 开始时间:2019/09/18 21:30 Spring5高级编程 版次:2019-01-01(第5版) Spring5最新版本:5.1.9 CURRENT GA 官方文档 Spring Fra ...
- 读《C#高级编程》第1章问题
读<C#高级编程>第1章 .Net机构体系笔记 网红的话:爸爸说我将来会是一个牛逼的程序员,因为我有一个梦,虽然脑壳笨但是做事情很能坚持. 本章主要是了解.Net的结构,都是一些概念,并没 ...
- Android高级编程笔记(四)深入探讨Activity(转)
在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一 ...
- C#高级编程9 第18章 部署
C#高级编程9 第18章 部署 使用 XCopy 进行部署 本主题演示如何通过将应用程序文件从一台计算机复制到另一台计算机来部署应用程序. 1.将项目中生成的程序集复制到目标计算机,生成的程序集位于项 ...
- C#高级编程9 第17章 使用VS2013-C#特性
C#高级编程9 第17章 使用VS2013 编辑定位到 如果默认勾选了这项,请去掉勾选,因为勾选之后解决方案的目录会根据当前文件选中. 可以设置项目并行生成数 版本控制软件设置 所有文本编辑器行号显示 ...
- C#高级编程9 第16章 错误和异常
C#高级编程9 第16章 错误和异常 了解这章可以学会如何处理系统异常以及错误信息. System.Exception类是.NET运行库抛出的异常,可以继承它定义自己的异常类. try块代码包含的代码 ...
- C#高级编程笔记之第三章:对象和类型
类和结构的区别 类成员 匿名类型 结构 弱引用 部分类 Object类,其他类都从该类派生而来 扩展方法 3.2 类和结构 类与结构的区别是它们在内存中的存储方式.访问方式(类似存储在堆上的引用类型, ...
- UNIX环境高级编程笔记之文件I/O
一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...
随机推荐
- HBase(一)——HBase介绍
HBase介绍 1.关系型数据库与非关系型数据库 (1)关系型数据库 关系型数据库最典型的数据机构是表,由二维表及其之间的联系所组成的一个数据组织 优点: 1.易于维护:都是使用表结构,格 ...
- caffe与tensorflow中的pooling
两个框架对poolin的处理方式不同,这就导致在转模型时容易踩雷 tensorflow通过“VALID”和“SAME”参数来控制 caffe 通过pad值来控制 参考:https://blog.csd ...
- [易学易懂系列|golang语言|零基础|快速入门|(二)]
现在我们来写代码,首先我们要新建一个项目. 新建项目: 点击:File>>New>>Project...如下图: 在New Project窗口,Location:输入:“goP ...
- xtrabackup备份mysql以及创建自动定时任务
xtrabackup的安装 安装依赖关系 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo y ...
- solaris硬盘格式化分区
创建EFI分区及挂载文件系统的过程: # format AVAILABLE DISK SELECTIONS: 0. c1t0d0 <LSI-MR9261-8i-2.12-557.86GB> ...
- CF1103C Johnny Solving (Codeforces Round #534 (Div. 1)) 思维+构造
题目传送门 https://codeforces.com/contest/1103/problem/C 题解 这个题还算一个有难度的不错的题目吧. 题目给出了两种回答方式: 找出一条长度 \(\geq ...
- cocos随笔
随笔: [ 1 ] active能隐藏元素,且不占空间,但仍存在,索引时,仍能得到 [ 2 ] 碰到参数传不进去的时候可以试着用属性赋值的方法代替传参 [ 3 ] getChildByName是按照 ...
- Arduino-位操作
读取指定位的数据 int x=bitRead(0x81,7); //0x81从右向左依次为第0位到第15位,第2个参数为第7位的1复制给x,使x=1 把数据写到指定位 int x=13; //x ...
- Docker(二):Docker入门教程
前言 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 ...
- 【NOIP2016提高组A组7.16】第三条跑道
题目 数据范围 分析 时限5000ms. 我们注意到\(a_{i}初始值以及x小于等于600且非零\) 也就是说,\(a_{i}\)的质因数一定小于600,而600以内的质因数只有109个. 那么考虑 ...