📜  春季-交易管理

📅  最后修改于: 2020-11-11 07:07:35             🧑  作者: Mango


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

  • 原子性-事务应被视为单个操作单元,这意味着整个操作序列是成功还是失败。

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

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

  • 持久性-事务完成后,该事务的结果必须永久保存,并且由于系统故障而无法从数据库中删除。

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

  • 使用begin transaction命令开始事务

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

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

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

本地与全球交易

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

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

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

程序化与声明式

Spring支持两种类型的事务管理-

  • 程序化交易管理-这意味着您必须借助编程来管理交易。这为您提供了极大的灵活性,但是很难维护。

  • 声明式事务管理-这意味着您将事务管理与业务代码分开。您仅使用注释或基于XML的配置来管理事务。

声明性事务管理比程序性事务管理更可取,尽管它不如程序性事务管理灵活,后者允许您通过代码控制事务。但是,作为一种横切关注点,可以使用AOP方法将声明式事务管理模块化。 Spring通过Spring AOP框架支持声明式事务管理。

春季交易抽象

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;
}
Sr.No Method & Description
1

TransactionStatus getTransaction(TransactionDefinition definition)

This method returns a currently active transaction or creates a new one, according to the specified propagation behavior.

2

void commit(TransactionStatus status)

This method commits the given transaction, with regard to its status.

3

void rollback(TransactionStatus status)

This method performs a rollback of the given transaction.

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

public interface TransactionDefinition {
   int getPropagationBehavior();
   int getIsolationLevel();
   String getName();
   int getTimeout();
   boolean isReadOnly();
}
Sr.No Method & Description
1

int getPropagationBehavior()

This method returns the propagation behavior. Spring offers all of the transaction propagation options familiar from EJB CMT.

2

int getIsolationLevel()

This method returns the degree to which this transaction is isolated from the work of other transactions.

3

String getName()

This method returns the name of this transaction.

4

int getTimeout()

This method returns the time in seconds in which the transaction must complete.

5

boolean isReadOnly()

This method returns whether the transaction is read-only.

以下是隔离级别的可能值-

Sr.No Isolation & Description
1

TransactionDefinition.ISOLATION_DEFAULT

This is the default isolation level.

2

TransactionDefinition.ISOLATION_READ_COMMITTED

Indicates that dirty reads are prevented; non-repeatable reads and phantom reads can occur.

3

TransactionDefinition.ISOLATION_READ_UNCOMMITTED

Indicates that dirty reads, non-repeatable reads, and phantom reads can occur.

4

TransactionDefinition.ISOLATION_REPEATABLE_READ

Indicates that dirty reads and non-repeatable reads are prevented; phantom reads can occur.

5

TransactionDefinition.ISOLATION_SERIALIZABLE

Indicates that dirty reads, non-repeatable reads, and phantom reads are prevented.

以下是传播类型的可能值-

Sr.No. Propagation & Description
1

TransactionDefinition.PROPAGATION_MANDATORY

Supports a current transaction; throws an exception if no current transaction exists.

2

TransactionDefinition.PROPAGATION_NESTED

Executes within a nested transaction if a current transaction exists.

3

TransactionDefinition.PROPAGATION_NEVER

Does not support a current transaction; throws an exception if a current transaction exists.

4

TransactionDefinition.PROPAGATION_NOT_SUPPORTED

Does not support a current transaction; rather always execute nontransactionally.

5

TransactionDefinition.PROPAGATION_REQUIRED

Supports a current transaction; creates a new one if none exists.

6

TransactionDefinition.PROPAGATION_REQUIRES_NEW

Creates a new transaction, suspending the current transaction if one exists.

7

TransactionDefinition.PROPAGATION_SUPPORTS

Supports a current transaction; executes non-transactionally if none exists.

8

TransactionDefinition.TIMEOUT_DEFAULT

Uses the default timeout of the underlying transaction system, or none if timeouts are not supported.

TransactionStatus接口为事务代码提供了一种控制事务执行和查询事务状态的简单方法。

public interface TransactionStatus extends SavepointManager {
   boolean isNewTransaction();
   boolean hasSavepoint();
   void setRollbackOnly();
   boolean isRollbackOnly();
   boolean isCompleted();
}
Sr.No. Method & Description
1

boolean hasSavepoint()

This method returns whether this transaction internally carries a savepoint, i.e., has been created as nested transaction based on a savepoint.

2

boolean isCompleted()

This method returns whether this transaction is completed, i.e., whether it has already been committed or rolled back.

3

boolean isNewTransaction()

This method returns true in case the present transaction is new.

4

boolean isRollbackOnly()

This method returns whether the transaction has been marked as rollback-only.

5

void setRollbackOnly()

This method sets the transaction as rollback-only.