Spring事务管理

将一组操作当作一个执行,只有成功或失败,没有部分执行。

事务就是将一组操作组合成一个,所有操作要么都执行,要么都不执行。是面向关系性数据库企业应用的重要部分。

事务的概念可以由四个关键属性描述,就是ACID:

Atomicity(原子性)事务被当作一个操作处理,不可再分,只有成功和失败两种状态
Consistency(统一性)事务的运行不改变数据库的完整性
Isolation(隔离)多个事务可能操作同一组数据,事务之间应相互隔离以防数据损坏
Durability(持久性)一旦事务执行成功,结果就被永久保存,不会因为系统错误而丢失

局部事务与全局事务:

主要的区别就是面向的计算环境不同

  • 局部事务面向中心化计算环境,就是应用程序和数据都存储在同一个主机,事务管理仅仅用于本机数据处理,所以很容易部署。
  • 全局事务面向分布式计算环境,就是资源分布在多个系统上,事务就要在局部(单个系统)和全局(全部系统)都要完成。

编程式事务和申明式事务

  • 编程式事务通过Java代码管理事务,好处是非常灵活,坏处是比较难维护。
  • 声明式事务通过xml文件或注解管理事务,可以和业务代码分开。

Spring事务隔离等级:

TransactionDefinition.ISOLATION_DEFAULT默认等级
TransactionDefinition.ISOLATION_READ_COMMITTED防止脏读,可能会发生不可重复读和幻读
TransactionDefinition.ISOLATION_READ_UNCOMMITTED脏读、不可重复读和幻读可能会发生
TransactionDefinition.ISOLATION_REPEATABLE_READ防止脏读和不可重复读,幻读可能会发生
TransactionDefinition.ISOLATION_SERIALIZABLE可以防止脏读、不可重复读和幻读

Spring事务传播行为:

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使用默认超时,如果系统不支持则为none
事务传播是指启用事务的代码之间相互调用产生的传播行为。

Spring事务抽象:

PlatformTransactionManager接口定义
public interface PlatformTransactionManager extends TransactionManager {
   TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;
   void commit(TransactionStatus status) throws TransactionException;
   void rollback(TransactionStatus status) throws TransactionException;
}
注意getTransaction方法会根据特定的传播行为新建一个或返回当前活跃的事务。

TransactionDefinition接口是核心支持:

public interface TransactionDefinition {
   int getPropagationBehavior();
   int getIsolationLevel();
   String getName();
   int getTimeout();
   boolean isReadOnly();
}

TransactionStatus接口可以用来控制事务执行和查询事务状态:

public interface TransactionStatus extends SavepointManager {
   boolean isNewTransaction();
   boolean hasSavepoint();
   void setRollbackOnly();
   boolean isRollbackOnly();
   boolean isCompleted();
}

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注