事务就是将一组操作组合成一个,所有操作要么都执行,要么都不执行。是面向关系性数据库企业应用的重要部分。
事务的概念可以由四个关键属性描述,就是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();
}