- Spring 核心基础知识
- 春天 - 主页
- 春天 - 概述
- 春天-建筑
- Spring - 环境设置
- Spring - Hello World 示例
- Spring - IoC 容器
- Spring - Bean 定义
- Spring - Bean 范围
- Spring - Bean 生命周期
- Spring - Bean 后处理器
- Spring-Bean定义继承
- Spring - 依赖注入
- Spring - 注入内部 Bean
- Spring - 注入集合
- Spring - Bean 自动装配
- 基于注释的配置
- Spring - 基于Java的配置
- Spring - Spring 中的事件处理
- Spring - Spring 中的自定义事件
- Spring - 使用 Spring 框架的 AOP
- Spring - JDBC 框架
- Spring-事务管理
- Spring - Web MVC 框架
- Spring - 使用 Log4J 进行日志记录
- 春季问答
- 春天 - 问题与解答
- 春季有用资源
- 春天 - 快速指南
- Spring - 有用的资源
- 春天 - 讨论
Spring-事务管理
数据库事务是被视为单个工作单元的一系列操作。这些操作要么完全完成,要么根本不起作用。事务管理是面向RDBMS的企业应用的重要组成部分,保证数据的完整性和一致性。事务的概念可以用以下四个关键属性来描述:ACID -
Atomics性- 事务应被视为单个操作单元,这意味着整个操作序列要么成功,要么不成功。
一致性- 这表示数据库的引用完整性、表中的唯一主键等的一致性。
隔离性- 可能同时有许多事务处理相同的数据集。每个事务都应与其他事务隔离,以防止数据损坏。
持久性- 一旦事务完成,该事务的结果必须永久保存,并且不能由于系统故障而从数据库中删除。
真正的 RDBMS 数据库系统将保证每个事务的所有四个属性。使用 SQL 向数据库发出事务的简单视图如下 -
使用开始事务命令开始事务。
使用 SQL 查询执行各种删除、更新或插入操作。
如果所有操作都成功则执行提交,否则回滚所有操作。
Spring 框架在不同的底层事务管理 API 之上提供了一个抽象层。Spring 的事务支持旨在通过向 POJO 添加事务功能来提供 EJB 事务的替代方案。Spring 支持编程式和声明式事务管理。EJB需要应用服务器,但是Spring事务管理可以不需要应用服务器来实现。
本地交易与全球交易
本地事务特定于单个事务资源(例如 JDBC 连接),而全局事务可以跨越多个事务资源(例如分布式系统中的事务)。
本地事务管理在应用程序组件和资源位于单个站点的集中式计算环境中非常有用,并且事务管理仅涉及在单个计算机上运行的本地数据管理器。本地交易更容易实现。
在所有资源分布在多个系统的分布式计算环境中需要全局事务管理。在这种情况下,事务管理需要在本地和全局级别上完成。分布式或全局事务跨多个系统执行,其执行需要全局事务管理系统和所有涉及系统的所有本地数据管理器之间的协调。
程序式与声明式
Spring支持两种类型的事务管理 -
声明式事务管理优于编程式事务管理,尽管它不如编程式事务管理灵活,编程式事务管理允许您通过代码控制事务。但作为一种横切关注点,声明式事务管理可以通过 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; }
先生编号 | 方法及说明 |
---|---|
1 |
TransactionStatus getTransaction(TransactionDefinition 定义) 该方法根据指定的传播Behave返回当前活动的事务或创建新的事务。 |
2 |
无效提交(事务状态状态) 此方法提交给定事务及其状态。 |
3 |
无效回滚(事务状态状态) 此方法执行给定事务的回滚。 |
TransactionDefinition是Spring 中事务支持的核心接口,其定义如下:
public interface TransactionDefinition { int getPropagationBehavior(); int getIsolationLevel(); String getName(); int getTimeout(); boolean isReadOnly(); }
先生编号 | 方法及说明 |
---|---|
1 |
int getPropagationBehavior() 该方法返回传播Behave。Spring 提供了 EJB CMT 中熟悉的所有事务传播选项。 |
2 |
int getIsolationLevel() 该方法返回该事务与其他事务的工作隔离的程度。 |
3 |
字符串 getName() 该方法返回该交易的名称。 |
4 |
int getTimeout() 此方法返回事务必须完成的时间(以秒为单位)。 |
5 |
布尔值 isReadOnly() 该方法返回事务是否是只读的。 |
以下是隔离级别的可能值 -
先生编号 | 隔离和描述 |
---|---|
1 |
TransactionDefinition.ISOLATION_DEFAULT 这是默认的隔离级别。 |
2 |
TransactionDefinition.ISOLATION_READ_COMMITTED 表示防止脏读;可能会发生不可重复读取和幻读。 |
3 |
TransactionDefinition.ISOLATION_READ_UNCOMMITTED 表示可能发生脏读、不可重复读和幻读。 |
4 |
TransactionDefinition.ISOLATION_REPEATABLE_READ 表示防止脏读和不可重复读;可能会发生幻读。 |
5 |
TransactionDefinition.ISOLATION_SERIALIZABLE 表示防止脏读、不可重复读和幻读。 |
以下是传播类型的可能值 -
先生。 | 传播与描述 |
---|---|
1 |
TransactionDefinition.PROPAGATION_MANDATORY 支持当前交易;如果当前不存在事务,则抛出异常。 |
2 |
TransactionDefinition.PROPAGATION_NESTED 如果当前事务存在,则在嵌套事务中执行。 |
3 |
TransactionDefinition.PROPAGATION_NEVER 不支持当前交易;如果当前事务存在,则抛出异常。 |
4 |
TransactionDefinition.PROPAGATION_NOT_SUPPORTED 不支持当前交易;而总是以非事务方式执行。 |
5 |
TransactionDefinition.PROPAGATION_REQUIRED 支持当前交易;如果不存在则创建一个新的。 |
6 |
TransactionDefinition.PROPAGATION_REQUIRES_NEW 创建一个新事务,并暂停当前事务(如果存在)。 |
7 |
TransactionDefinition.PROPAGATION_SUPPORTS 支持当前交易;如果不存在则以非事务方式执行。 |
8 |
TransactionDefinition.TIMEOUT_DEFAULT 使用底层事务系统的默认超时,如果不支持超时则不使用。 |
TransactionStatus接口为事务代码提供了一种简单的方法来控制事务执行和查询事务状态。
public interface TransactionStatus extends SavepointManager { boolean isNewTransaction(); boolean hasSavepoint(); void setRollbackOnly(); boolean isRollbackOnly(); boolean isCompleted(); }
先生。 | 方法及说明 |
---|---|
1 |
布尔值 hasSavepoint() 该方法返回该事务内部是否带有保存点,即是否已创建为基于保存点的嵌套事务。 |
2 |
布尔值 isCompleted() 该方法返回该事务是否完成,即是否已经提交或回滚。 |
3 |
布尔值 isNewTransaction() 如果当前交易是新的,则此方法返回 true。 |
4 |
布尔 isRollbackOnly() 此方法返回事务是否已标记为仅回滚。 |
5 |
无效 setRollbackOnly() 此方法将事务设置为仅回滚。 |