Spring事务管理概述
以下内容引用自http://wiki.jikexueyuan.com/project/spring/transaction-management.html:
数据库事务是一个被视为单一的工作单元的操作序列。这些操作应该要么完整地执行,要么完全不执行。事务管理是一个重要组成部分,RDBMS面向企业应用程序,以确保数据完整性和一致性。事务的概念可以描述为具有以下四个关键属性描述为ACID:
原子性(Atomicity):事务应该当作一个单独单元的操作,这意味着整个序列操作要么是成功,要么是失败的。
一致性(Consistency):这表示数据库的引用完整性的一致性,表中唯一的主键等。
隔离性(Isolation):可能同时处理很多有相同的数据集的事务,每个事务应该与其他事务隔离,以防止数据损坏。
- 持久性(Durability):一个事务一旦完成全部操作后,这个事务的结果必须是永久性的,不能因系统故障而从数据库中删除。
一个真正的RDBMS数据库系统将为每个事务保证所有的四个属性。使用SQL发布到数据库中的事务的简单视图如下:
使用begin transaction命令开始事务。
使用SQL查询语句执行各种删除、更新或插入操作。
- 如果所有的操作都成功,则执行提交操作,否则回滚所有操作。
Spring框架在不同的底层事务管理APIs的顶部提供了一个抽象层。Spring的事务支持旨在通过添加事务能力到POJOs来提供给EJB事务一个选择方案。Spring支持编程式和声明式事务管理。EJBs需要一个应用程序服务器,但Spring事务管理可以在不需要应用程序服务器的情况下实现。
局部事物 vs. 全局事务
局部事务是特定于一个单一的事务资源,如一个JDBC连接,而全局事务可以跨多个事务资源事务,如在一个分布式系统中的事务。
局部事务管理在一个集中的计算环境中是有用的,该计算环境中应用程序组件和资源位于一个单位点,而事务管理只涉及到一个运行在一个单一机器中的本地数据管理器。局部事务更容易实现。
全局事务管理需要在分布式计算环境中,所有的资源都分布在多个系统中。在这种情况下事务管理需要同时在局部和全局范围内进行。分布式或全局事务跨多个系统执行,它的执行需要全局事务管理系统和所有相关系统的局部数据管理人员之间的协调。
编程式 vs. 声明式
Spring支持两种类型的事务管理:
编程式事务管理:这意味着你在编程的帮助下有管理事务。这给了你极大的灵活性,但却很难维护。
- 声明式事务管理:这意味着你从业务代码中分离事务管理。你仅仅使用注解或XML配置来管理事务。
声明式事务管理比编程式事务管理更可取,尽管它不如编程式事务管理灵活,但它允许你通过代码控制事务。但作为一种横切关注点,声明式事务管理可以使用AOP方法进行模块化。Spring支持使用Spring AOP框架的声明式事务管理。
Spring事务抽象
Spring事务抽象的关键是由org.springframework.transaction.PlatformTransactionManager接口定义,如下所示:
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
| 方法 | 描述 |
|---|---|
|
TransactionStatus getTransaction(TransactionDefinition definition) |
根据指定的传播行为,该方法返回当前活动事务或创建一个新的事务。 |
|
void commit(TransactionStatus status) |
该方法提交给定的事务和关于它的状态。 |
|
void rollback(TransactionStatus status) |
该方法执行一个给定事务的回滚。 |
TransactionDefinition是在Spring中事务支持的核心接口,它的定义如下:
public interface TransactionDefinition {
int getPropagationBehavior();
int getIsolationLevel();
String getName();
int getTimeout();
boolean isReadOnly();
}
| 方法 | 描述 |
|---|---|
|
int getPropagationBehavior() |
该方法返回传播行为。Spring提供了与EJB CMT类似的所有的事务传播选项。 |
|
int getIsolationLevel() |
该方法返回该事务独立于其他事务的工作的程度。 |
|
String getName() |
该方法返回该事务的名称。 |
|
int getTimeout() |
该方法返回以秒为单位的时间间隔,事务必须在该时间间隔内完成。 |
|
boolean isReadOnly() |
该方法返回该事务是否是只读的。 |
下面是隔离级别的可能值:
| 隔离 | 描述 |
|---|---|
|
TransactionDefinition.ISOLATION_DEFAULT |
这是默认的隔离级别。 |
|
TransactionDefinition.ISOLATION_READ_COMMITTED |
表明能够阻止误读;可以发生不可重复读和虚读。 |
|
TransactionDefinition.ISOLATION_READ_UNCOMMITTED |
表明可以发生误读、不可重复读和虚读。 |
|
TransactionDefinition.ISOLATION_REPEATABLE_READ |
表明能够阻止误读和不可重复读;可以发生虚读。 |
|
TransactionDefinition.ISOLATION_SERIALIZABLE |
表明能够阻止误读、不可重复读和虚读。 |
下面是传播类型的可能值:
| 传播 | 描述 |
|---|---|
|
TransactionDefinition.PROPAGATION_MANDATORY |
支持当前事务;如果不存在当前事务,则抛出一个异常。 |
|
TransactionDefinition.PROPAGATION_NESTED |
如果存在当前事务,则在一个嵌套的事务中执行。 |
|
TransactionDefinition.PROPAGATION_NEVER |
不支持当前事务;如果存在当前事务,则抛出一个异常。 |
|
TransactionDefinition.PROPAGATION_NOT_SUPPORTED |
不支持当前事务;而总是执行非事务性。 |
|
TransactionDefinition.PROPAGATION_REQUIRED |
支持当前事务;如果不存在事务,则创建一个新的事务。 |
|
TransactionDefinition.PROPAGATION_REQUIRES_NEW |
创建一个新事务,如果存在一个事务,则把当前事务挂起。 |
|
TransactionDefinition.PROPAGATION_SUPPORTS |
支持当前事务;如果不存在,则执行非事务性。 |
|
TransactionDefinition.TIMEOUT_DEFAULT |
使用默认超时的底层事务系统,或者如果不支持超时则没有。 |
TransactionStatus接口为事务代码提供了一个简单的方法来控制事务的执行和查询事务状态。
public interface TransactionStatus extends SavepointManager {
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
boolean isCompleted();
}
| 方法 | 描述 |
|---|---|
|
boolean hasSavepoint() |
该方法返回该事务内部是否有一个保存点,也就是说,基于一个保存点已经创建了嵌套事务。 |
|
boolean isCompleted() |
该方法返回该事务是否完成,也就是说,它是否已经提交或回滚。 |
|
boolean isNewTransaction() |
在当前事务时新的情况下,该方法返回true。 |
|
boolean isRollbackOnly() |
该方法返回该事务是否已标记为rollback-only。 |
|
void setRollbackOnly() |
该方法设置该事务为rollback-only标记。 |
Spring事务管理概述的更多相关文章
- 【Spring】Spring的事务管理 - 1、Spring事务管理概述(数据库事务、Spring事务管理的核心接口)
Spring事务管理概述 文章目录 Spring事务管理概述 数据库事务 什么是Spring的事务管理? Spring对事务管理的支持 Spring事务管理的核心接口 Platform Transac ...
- Spring - 事务管理概述
什么是事务管理? 第一个问题:什么是事务? 事务一般是相对数据库而言的,对于数据库一次操作就属于一个事务, 一次操作可以是几句 SQL 语句,也可以是若干行 JDBC 的 Java 语句.事务既然 ...
- Spring 事务管理高级应用难点剖析--转
第 1 部分 http://www.ibm.com/search/csass/search/?q=%E4%BA%8B%E5%8A%A1&sn=dw&lang=zh&cc=CN& ...
- 【转】Spring事务管理
原文链接 在 Spring 中,事务是通过 TransactionDefinition 接口来定义的.该接口包含与事务属性有关的方法.具体如清单 1 所示: 清单 1. TransactionDefi ...
- spring事务管理——编程式事务、声明式事务
本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 ...
- Spring 事务管理高级应用难点剖析: 第 3 部分
本文是“Spring 事务管理高级应用难点剖析” 系列文章的第 3 部分,作者将继续深入剖析在实际 Spring 事务管理应用中容易遇见的一些难点,包括在使用 Spring JDBC 时如果直接获取 ...
- Spring5.0源码学习系列之事务管理概述
Spring5.0源码学习系列之事务管理概述(十一),在学习事务管理的源码之前,需要对事务的基本理论比较熟悉,所以本章节会对事务管理的基本理论进行描述 1.什么是事务? 事务就是一组原子性的SQL操作 ...
- 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...
- spring事务管理器设计思想(二)
上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...
随机推荐
- FPGA-信号边缘检测
在FPGA逻辑电路中,输入信号的边缘检测是一个常用的操作,这算是FPGA的基本功之一. 信号边缘检测应用十分广泛,例如:通信协议的时序操作,按键的检测等,都应用到按键的检测.按键的检测分为上升沿和下降 ...
- Python3 OpenCV3 图像处理基础
开发环境搭建 本人使用的是Ubuntu 16.04LTS. 1.安装Python3 ## 其实 Ubuntu 16.04 系统自带了 Python 3.5.2,因此不需要再安装了?但是需要安装一些开发 ...
- js 数组过滤 filter
let res = this.list.filter(item => routeEqual(this.currentRouteObj, item) || item.name === this.$ ...
- linux 隐藏进程
1.首先推荐一个后门程序https://github.com/f0rb1dd3n/Reptile 具体可以了解一下功能非常强大. 2.源码如下 root@ubuntu:/var/srt/libproc ...
- reciting
When I was seventeen, I read a quote that went something like, '' if you live your each day as if it ...
- centos7下LVM挂载和扩容
说明:此操作在centos7下进行,如果是centos6发行版,需要注意格式化LV的文件系统类型(centos7.0开始默认文件系统是xfs,centos6是ext4).最后一步写入系统的类型,其中文 ...
- 全新Ubentu系统没有make,gcc命令解决办法
一定要记得先update sudo apt-get update 然后输入下述命令即可 sudo apt-get install make sudo apt-get install gcc
- spoj-TSUM Triple Sums
题目描述 题解: 很吊的容斥+$FFT$,但是并不难. 首先,由于有重复,我们要容斥. 怎么办? 记录三个多项式, 只取一个:$w1$; 相同物体拿两个:$w2$; 相同物体拿三个:$w3$; 然后答 ...
- nginx 获取真实ip
使用阿里云SLB,无法获取真实ip问题 官方给出的是如下用法,需要安装模块,大体上是没有错的,但是比较模糊,实际操作中可能会踩坑,所以参考学习即可,不必照搬.(那个http_realip_module ...
- Properties类操作.properties配置文件方法总结
一.properties文件 Properties文件是java中很常用的一种配置文件,文件后缀为“.properties”,属文本文件,文件的内容格式是“键=值”的格式,可以用“#”作为注释,jav ...