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-- 如果当前没有事务,就新建一个事务.这是最常见 ...
随机推荐
- 洛谷 P2319 [HNOI2006]超级英雄
题目描述 题目描述 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确回答一 ...
- 在Oracle用SQL处理以 System.currentTimeMillis
有時為了系統的需求會紀錄到毫秒(Millisecond),我們會接將得到的值寫入db,但是如果要用SQL 做時間範圍的搜尋,有以下做法( systemdate欄位存放System.currentTim ...
- TCP和流
http://www.cnblogs.com/lwzz/archive/2011/07/03/2096963.html TCP是一种流协议(stream protocol).这就意味着数据是以字节流的 ...
- C#飞行棋总结
以下是掷色子的一个代码,比较有代表性,里面的逻辑和内容都已注释,可通过注释了解这一方法的运作模式. public static void RowTouZi(int playerPos) //掷色子 { ...
- jmeter 接口测试简介
前言: 本文主要针对http接口进行测试,使用Jmeter工具实现. Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对 ...
- 总结vue2.0 配置的实例方法
总结vue2.0 配置的实例方法 http://www.php.cn/js-tutorial-369603.html
- JS的本地保存localStorage、sessionStorage用法总结
localStorage 生命周期是永久的 这意味着除非用户显示在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在. sessionStorage 生命周期为当前窗口或标签 ...
- SQL Server数据库的除法默认向下取整,要返回小数的解决方法
num1; / 1000.0 num2; * 1.0 num3; num4; 结果:
- centos7 install vim8
centos7 install vim8 Git and dependency Git: https://github.com/vim/vim # yum install -y perl-devel ...
- zabbix auto discovery
1.configuration>discovery>create discovery rule ip range:192.168.43.2-254 check: http 80 2.con ...