1 事务管理
- 提供的统一的API接口支持不同的资源
- 提供声明式事务管理
- 方便的与Spring框架集成
- 多个资源的事务管理、同步
2 事务抽象
2.1 事务管理器 - PlatformTransactionManager
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition)
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
2.2 事务定义 - TransactionDefinition
public interface TransactionDefinition {
int getPropagationBehavior();
int getlsolationLevel();
String getName();
int getTimeout();
boolean isReadOnly();
}
2.3 事务隔离机制
TransactionDefinition.ISOLATION_DEFAULT
TransactionDefinition.ISOLATION_READ_COMMITTED
TransactionDefinition.ISOLATION_READ_UNCOMMITTED
TransactionDefinition.ISOLATION_REPEATABLE_READ
TransactionDefinition.ISOLATION_SERIALIZABLE
2.4 事务传播机制
TransactionDefinition接口定义了如下int 常量:
PROPAGATION_REQUIRED (Default)
支持当前事务; 如果不存在,请创建一个新的。事务定义的默认设置,并且定义了事务同步的作用域
PROPAGATION_SUPPORTS
支持当前事务; 如果不存在,则以非事务方式执行。
对于具有事务同步的事务管理器, PROPAGATION_SUPPORTS与根本没有事务略有不同,因为它定义了同步可能适用的事务范围。 结果,将为整个指定范围共享相同的资源(JDBC Connection ,Hibernate Session等)。
准确的行为取决于事务管理器的实际同步配置!
通常,请谨慎使用PROPAGATION_SUPPORTS ! 特别是,不要依赖PROPAGATION_SUPPORTS范围内的
- PROPAGATION_REQUIRED
- PROPAGATION_REQUIRES_NEW (这可能会在运行时导致同步冲突)
如果这种嵌套是不可避免的,请确保正确配置事务管理器(通常切换为“实际事务同步”)
PROPAGATION_MANDATORY
PROPAGATION_REQUIRES_NEW
PROPAGATION_NOT_SUPPORTED
不支持当前事务;而是始终以非事务方式执行。类似于同名的EJB事务属性。
实际的事务中止将无法在所有事务管理器中立即使用。 这尤其适用于org.springframework.transaction.jta.JtaTransactionManager ,它要求javax.transaction.TransactionManager对其可用(在标准Java EE中是特定于服务器的)。
事务同步在PROPAGATION_NOT_SUPPORTED作用域内不可用。 现有同步将被挂起并适时恢复
TransactionDefinition.PROPAGATION_NEVER
不支持当前事务;如果当前事务存在,则抛异常。类似于同名的EJB事务属性。事务同步在PROPAGATION_NEVER作用域内不可用
- PROPAGATION_NESTEDED
-
REQUIRED
适用于增删改
-
SUPPORTS
适用于查询。
TransactionStatus
Spring提供了PlatformTransactionManager表示事务管理器,所有事务都由它管理。
而事务由TransactionStatus表示。
public interface TransactionStatus extends SavepointManager {
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
boolean isCompleted();
}
如果手写事务代码,使用try…catch如下:
TransactionStatus tx = null;
try {
// 开启事务:
tx = txManager.getTransaction(new DefaultTransactionDefinition());
// 相关JDBC操作:
jdbcTemplate.update("...");
jdbcTemplate.update("...");
// 提交事务:
txManager.commit(tx);
} catch (RuntimeException e) {
// 回滚事务:
txManager.rollback(tx);
throw e;
}