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-- 如果当前没有事务,就新建一个事务.这是最常见 ...
随机推荐
- 云梯互联:所有主机已全面支持免费SSL!附小白配置教程。
HTTPS和HTTP的区别:1.HTTPS是加密传输协议,HTTP是名文传输协议;2.HTTPS需要用到SSL证书,而HTTP不用;3.HTTPS比HTTP更加安全,对搜索引擎更友好,利于SEO4. ...
- SQLite -语法
SQLite -语法 SQLite是紧随其后的是独特的组称为语法的规则和指导方针.本教程为您提供了快速启动和SQLite的清单的所有基本SQLite语法. 大小写敏感性 注意重要的一点是,SQLite ...
- SpringBoot自定义一个starter
@Configuration //指定这个类是一个配置类 @ConditionalOnXXX //在指定条件成立的情况下自动配置类生效 @AutoConfigureAfter //指定自动配置类的顺序 ...
- c++ extern
一.extern关键字的作用 文件中定义的全局变量的可见性扩展到整个程序是在链接完成之后,而在编译阶段,他们的可见性仍局限于各自的文件. 编译器的目光不够长远,编译器没有能够意识到,某个变量符号虽然不 ...
- 清除SQL Server 2008记住的数据库地址、登录名和密码
在服务器上登录过数据库信息,并且选择了记住了密码,由于服务器数据库很多人在使用,有必要删除信息 定位到fileC:\Users\%username%\AppData\Roaming\Microsoft ...
- Java中Synchronized和Lock的使用
Lock的锁定是通过代码实现的,而 synchronized 是在 JVM 层面上实现的 synchronized在锁定时如果方法块抛出异常,JVM 会自动将锁释放掉,不会因为出了异常没有释放锁造成线 ...
- Yii2 advance swiftmailer 不能发送邮件
我用的是Yii2高级模板,在配置好邮箱后,并编写测试,测试结果表明是发送成功的,但我的邮箱就是接受不了邮件. 经过排查发现,是由 common/config/main-local.php 文件的 'u ...
- NOIp2018 提高组初赛试题参考答案
- FastNet C++/Python 网络通信库之 协议
协议可以使用的基础数据类型: UInt8,UInt16,UInt32,UInt64Int8,Int16,Int32,Int64Float,Double,Bool,String [T] 数组,T代表元 ...
- bootstrap3之栅格系统
原理 栅格系统的核心就是媒体查询.指定的尺寸都是百分比,也就是流式布局. 查看bootstrap中的源码可以发现,对样式的定义次序全都是依次 xs.sm.md.lg,如: // grid-framew ...