事务Transaction的理解(一)

目录

什么是事务?

局部事务和全局事务

可编程事务管理和Java注解型事务管理

Spring抽象事务层


什么是事务?

数据库事务就是将数据库的一系列操作作为一个工作单元。这一系列的操作要么一起生效要么就全都不起作用。事务管理是数据库中非常重要的组成部分,它能确保数据的一致性和完整性。

事务具有如下几个特点:

  • 原子性
  • 一致性
  • 隔离性
  • 牢固性

一个关系型数据库的事务管理必须满足上边的四个特性,拿一个简单的SQL例子来展示一下,

  • 用 begin transaction 来开始事务;

  • 用SQL执行deleted, update or insert操作;

  • 如果所有的这些操作执行成功,那就执行commit 否则的话 rollback所有的操作。

Spring或者Spring Boot在各种各样的事务Transaction管理API上封装了一层抽象层。Spring Boot 提供了两种事务管理方式:可编程型和Java注解型事务管理, 在下一系列来分别阐述其使用详解。

局部事务和全局事务

局部事务就是指单一资源的事务管理,比方说一个JDBC连接。而全局事务扩展到多个事务资源,比如分布式事务。

如果应用程序和数据库部署在单一位置上(application,resource可不在同一机器上),事务也仅仅是在一个机器上进行的数据管理,在这种情况下,局部事务是非常有效的。

而在分布式环境里, 所有的资源会部署到多个系统里,在这种情况下,事务管理要在局部层和全局层都要生效。一个分布式事务或者全局事务运行在多个系统里,这就要求全局事务管理和局部的数据管理必须协调一致地运行下去。

可编程事务管理和Java注解型事务管理

Spring和Spring Boot 支持两种类型的事务管理:

  • 可编程事务管理:可以通过自己编程来实现事务管理,在一定程度上带来复杂性,相对而言较难维护。
  • 注解型事务管理:可以将事务管理与业务逻辑相分离,可以通过注解或者XML配置来实现。

关于这一节内容,会在Transaction理解(二)和(三)里分别阐述。

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;

}
PlatformTransactionManager
MethodDescription
getTransactionReturn a currently active transaction or create a new one, according to the specified propagation behavior.
commitCommit the given transaction, with regard to its status. If the transaction has been marked rollback-only programmatically, perform a rollback.
rollbackPerform a rollback of the given transaction.

 

 

 

 

 

 

 

另外一个核心组成部分是TransactionDefinition接口

public interface TransactionDefinition {

	int PROPAGATION_REQUIRED = 0;

	int PROPAGATION_SUPPORTS = 1;

	int PROPAGATION_MANDATORY = 2;

	int PROPAGATION_REQUIRES_NEW = 3;

	int PROPAGATION_NOT_SUPPORTED = 4;

	int PROPAGATION_NEVER = 5;

	int PROPAGATION_NESTED = 6;

	int ISOLATION_DEFAULT = -1;

	int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;

	int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;

	int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;

	int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;

	int TIMEOUT_DEFAULT = -1;

	int getPropagationBehavior();

	int getIsolationLevel();

	int getTimeout();

	boolean isReadOnly();

	String getName();

}
Method in TransactionDefinition
Method

Description

getPropagationBehavior

Return the propagation behavior.

Must return one of the PROPAGATION_XXX constants defined on this interface.

getIsolationLevel

Return the isolation level.

getTimeoutReturn the transaction timeout.
isReadOnlyReturn whether to optimize as a read-only transaction.
getName

Return the name of this transaction. Can be null.

 

 

 

 

 

 

 

 

 

接下来列举一下如何事务的隔离性

Isolation
IsolationDescription
ISOLATION_DEFAULTUse the default isolation level of the underlying datastore. All other levels correspond to the JDBC isolation levels.
ISOLATION_READ_UNCOMMITTEDIndicates that dirty reads, non-repeatable reads and phantom reads can occur
ISOLATION_READ_COMMITTEDIndicates that dirty reads are prevented; non-repeatable reads and phantom reads can occur.
ISOLATION_REPEATABLE_READIndicates that dirty reads and non-repeatable reads are prevented; phantom reads can occur.
ISOLATION_SERIALIZABLEIndicates that dirty reads, non-repeatable reads and phantom reads are prevented.

 

 

 

 

 

 

 

 

 

 

接下来还有事务之间的关系

Propagation
PropagationDescription
PROPAGATION_REQUIRED

Support a current transaction; create a new one if none exists. Analogous to the EJB transaction attribute of the same name.

PROPAGATION_SUPPORTS

Support a current transaction; execute non-transactionally if none exists. Analogous to the EJB transaction attribute of the same name.

PROPAGATION_MANDATORY

Support a current transaction; throw an exception if no current transaction exists. Analogous to the EJB transaction attribute of the same name.

PROPAGATION_REQUIRES_NEW

Create a new transaction, suspending the current transaction if one exists. Analogous to the EJB transaction attribute of the same name.

PROPAGATION_NOT_SUPPORTED

Do not support a current transaction; rather always execute non-transactionally. Analogous to the EJB transaction attribute of the same name.

PROPAGATION_NEVER

Do not support a current transaction; throw an exception if a current transaction exists. Analogous to the EJB transaction attribute of the same name.

PROPAGATION_NESTED

Execute within a nested transaction if a current transaction exists, behave like PROPAGATION_REQUIRED else. There is no analogous feature in EJB.

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

TransactionStatus 接口提供了一系列管理事务和获取事务状态的方式方法。

public interface TransactionStatus extends SavepointManager, Flushable {

	/**
	 * Return whether the present transaction is new (else participating
	 * in an existing transaction, or potentially not running in an
	 * actual transaction in the first place).
	 */
	boolean isNewTransaction();

	/**
	 * Return whether this transaction internally carries a savepoint,
	 * that is, has been created as nested transaction based on a savepoint.
	 * <p>This method is mainly here for diagnostic purposes, alongside
	 * {@link #isNewTransaction()}. For programmatic handling of custom
	 * savepoints, use SavepointManager's operations.
	 * @see #isNewTransaction()
	 * @see #createSavepoint
	 * @see #rollbackToSavepoint(Object)
	 * @see #releaseSavepoint(Object)
	 */
	boolean hasSavepoint();

	/**
	 * Set the transaction rollback-only. This instructs the transaction manager
	 * that the only possible outcome of the transaction may be a rollback, as
	 * alternative to throwing an exception which would in turn trigger a rollback.
	 * <p>This is mainly intended for transactions managed by
	 * {@link org.springframework.transaction.support.TransactionTemplate} or
	 * {@link org.springframework.transaction.interceptor.TransactionInterceptor},
	 * where the actual commit/rollback decision is made by the container.
	 * @see org.springframework.transaction.support.TransactionCallback#doInTransaction
	 * @see org.springframework.transaction.interceptor.TransactionAttribute#rollbackOn
	 */
	void setRollbackOnly();

	/**
	 * Return whether the transaction has been marked as rollback-only
	 * (either by the application or by the transaction infrastructure).
	 */
	boolean isRollbackOnly();

	/**
	 * Flush the underlying session to the datastore, if applicable:
	 * for example, all affected Hibernate/JPA sessions.
	 * <p>This is effectively just a hint and may be a no-op if the underlying
	 * transaction manager does not have a flush concept. A flush signal may
	 * get applied to the primary resource or to transaction synchronizations,
	 * depending on the underlying resource.
	 */
	@Override
	void flush();

	/**
	 * Return whether this transaction is completed, that is,
	 * whether it has already been committed or rolled back.
	 * @see PlatformTransactionManager#commit
	 * @see PlatformTransactionManager#rollback
	 */
	boolean isCompleted();

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值