专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 Spring的事务管理

Spring的事务管理

更新时间:2021-12-10 10:49:59 来源:赢咖4 浏览666次

数据库事务是被视为单个工作单元的一系列操作。这些操作要么完全完成,要么根本不起作用。Spring事务管理是面向 RDBMS 的企业应用程序的重要组成部分,以确保数据的完整性和一致性。交易的概念可以用以下四个关键属性描述为ACID -

原子性- 事务应被视为单个操作单元,这意味着整个操作序列要么成功要么不成功。

Consistency - 这表示数据库引用完整性、表中唯一主键等的一致性。

隔离- 可能同时有许多事务处理具有相同的数据集。每个事务都应与其他事务隔离以防止数据损坏。

持久性- 一旦事务完成,该事务的结果必须是永久性的,并且不能由于系统故障而从数据库中删除。

一个真正的 RDBMS 数据库系统将保证每个事务的所有四个属性。使用 SQL 向数据库发出的事务的简单视图如下 -

使用开始事务命令开始事务。

使用 SQL 查询执行各种删除、更新或插入操作。

如果所有操作都成功,则执行提交,否则回滚所有操作。

Spring 框架在不同的底层事务管理 API 之上提供了一个抽象层。Spring 的事务支持旨在通过向 POJO 添加事务功能来提供 EJB 事务的替代方案。Spring 支持编程式和声明式事务管理。EJB 需要应用程序服务器,但无需应用程序服务器即可实现 Spring 事务管理。

本地与全球交易

本地事务特定于单个事务资源,例如 JDBC 连接,而全局事务可以跨越多个事务资源,例如分布式系统中的事务。

本地事务管理在应用程序组件和资源位于单个站点的集中式计算环境中非常有用,并且事务管理仅涉及在单台机器上运行的本地数据管理器。本地事务更容易实现。

在所有资源分布在多个系统上的分布式计算环境中,需要全局事务管理。在这种情况下,需要在本地和全局级别进行事务管理。分布式或全局事务跨多个系统执行,其执行需要全局事务管理系统和所有相关系统的所有本地数据管理器之间的协调。

程序化与声明式

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;
}
  方法和说明
1

TransactionStatus getTransaction(TransactionDefinition 定义)

此方法根据指定的传播行为返回当前活动的事务或创建一个新事务。

2

无效提交(TransactionStatus 状态)

这个方法提交给定的事务,关于它的状态。

3

无效回滚(TransactionStatus 状态)

此方法执行给定事务的回滚。

该TransactionDefinition的是Spring中的事务支持的核心接口,并将其定义如下

public interface TransactionDefinition {
   int getPropagationBehavior();
   int getIsolationLevel();
   String getName();
   int getTimeout();
   boolean isReadOnly();
}
  方法和说明
1

int getPropagationBehavior()

此方法返回传播行为。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

布尔值 h​​asSavepoint()

该方法返回此事务内部是否带有保存点,即是否已创建为基于保存点的嵌套事务。

2

布尔值 isCompleted()

该方法返回该事务是否完成,即它是否已经提交或回滚。

3

布尔值 isNewTransaction()

如果当前交易是新的,则此方法返回 true。

4

布尔值 isRollbackOnly()

此方法返回事务是否已标记为仅回滚。

5

void setRollbackOnly()

此方法将事务设置为仅回滚。

以上就是关于“Spring的事务管理”的介绍,如果大家对此比较感兴趣,想了解更多相关知识,可以关注一下赢咖4的Java赢咖4在线学习,里面的课程内容全面细致,由浅到深,适合没有基础的小伙伴学习,希望对大家能够有所帮。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>