第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 接口使用 TransactionDefinitionTransactionStatus 接口来创建和管理事务。

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章的更多相关文章

  1. C#高级编程笔记之第二章:核心C#

    变量的初始化和作用域 C#的预定义数据类型 流控制 枚举 名称空间 预处理命令 C#编程的推荐规则和约定 变量的初始化和作用域 初始化 C#有两个方法可以一确保变量在使用前进行了初始化: 变量是字段, ...

  2. C#高级编程笔记之第一章:.NET体系结构

    1.1 C#与.NET的关系 C#不能孤立地使用,必须与.NET Framework一起使用一起考虑. (1)C#的体系结构和方法论反映了.NET基础方法论. (2)多数情况下,C#的特定语言功能取决 ...

  3. 20191105 《Spring5高级编程》笔记-【目录】

    背景 开始时间:2019/09/18 21:30 Spring5高级编程 版次:2019-01-01(第5版) Spring5最新版本:5.1.9 CURRENT GA 官方文档 Spring Fra ...

  4. 读《C#高级编程》第1章问题

    读<C#高级编程>第1章 .Net机构体系笔记 网红的话:爸爸说我将来会是一个牛逼的程序员,因为我有一个梦,虽然脑壳笨但是做事情很能坚持. 本章主要是了解.Net的结构,都是一些概念,并没 ...

  5. Android高级编程笔记(四)深入探讨Activity(转)

    在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一 ...

  6. C#高级编程9 第18章 部署

    C#高级编程9 第18章 部署 使用 XCopy 进行部署 本主题演示如何通过将应用程序文件从一台计算机复制到另一台计算机来部署应用程序. 1.将项目中生成的程序集复制到目标计算机,生成的程序集位于项 ...

  7. C#高级编程9 第17章 使用VS2013-C#特性

    C#高级编程9 第17章 使用VS2013 编辑定位到 如果默认勾选了这项,请去掉勾选,因为勾选之后解决方案的目录会根据当前文件选中. 可以设置项目并行生成数 版本控制软件设置 所有文本编辑器行号显示 ...

  8. C#高级编程9 第16章 错误和异常

    C#高级编程9 第16章 错误和异常 了解这章可以学会如何处理系统异常以及错误信息. System.Exception类是.NET运行库抛出的异常,可以继承它定义自己的异常类. try块代码包含的代码 ...

  9. C#高级编程笔记之第三章:对象和类型

    类和结构的区别 类成员 匿名类型 结构 弱引用 部分类 Object类,其他类都从该类派生而来 扩展方法 3.2 类和结构 类与结构的区别是它们在内存中的存储方式.访问方式(类似存储在堆上的引用类型, ...

  10. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...

随机推荐

  1. windows下挂载NFS共享目录

    1.在打开或关闭Windows功能中,选择安装NFS客户端 2.在命令行中,输入“mount \\172.24.184.31\data x:\”,输入mount查看详细挂载参数(注意此时uid.gid ...

  2. Decision Trees 决策树

    Decision Trees (DT)是用于分类和回归的非参数监督学习方法. 目标是创建一个模型,通过学习从数据特征推断出的简单决策规则来预测目标变量的值. 例如,在下面的例子中,决策树从数据中学习用 ...

  3. AtCoder Beginner Contest 088 C Takahashi's Information

    Problem Statement We have a 3×3 grid. A number ci,j is written in the square (i,j), where (i,j) deno ...

  4. libevent cs

    int evutil_make_listen_socket_reuseable(evutil_socket_t sock): 相当于执行以下操作 int one = 1; setsockopt(soc ...

  5. C#基础知识之Ref Out Params 4种类型的参数

    一.按值传递参数 值参数是通过将实参的值复制到形参,来实现按值传递到方法,也就是我们通常说的按值传递. 方法被调用时,CLR做如下操作: 1.在托管栈中为形参分配空间: 2.将实参的值复制到形参. 这 ...

  6. vue组件样式scoped

    1.vue组件中的样式如果没加scrped,样式代表的是全局样式(避免组件之间样式的冲突).加了属性代表是模块化的. 其他组件引用button组件 上面分析了单个组件渲染后的结果,那么组件互相调用之后 ...

  7. MAN RPM

    RPM(8)   Red Hat Linux   RPM(8) NAME/名称       rpm - RPM Package Manager/RPM-RPM包管理器SYNOPSIS/简介  QUER ...

  8. R语言-变量命名规则

    1.大原则:只有字母(区分大小写).数字.“_”(下划线).“.”(英文句号)可以出现. 2.数字.下划线不能开头. 3.英文句号开头不能紧接数字. 就这么简单!

  9. delphi datetimetounix 和 unixtodatetime 全平台(FIREMONKEY)时区修正

    可能平时在转换UNIX时间时没有注意结果,当转换成UNIX时间后,再转换回来对比发现时间和标准时间差了8个小时.网上有相关的修正方法,但仅适用于WINDOWS平台,以下方法全平台适合. datetim ...

  10. es6 语法使用

    一.相关背景介绍 我们现在大多数人用的语法javascript 其实版本是ecmscript5,也是就es5.这个版本己经很多年了,且完美被各大浏览器所支持.所以很多学js的朋友可以一直分不清楚es5 ...