Spring事务管理接口PlatformTransactionManager
PlatformTransactionManager是Spring事务抽象的核心接口。
接口定义
Java
public interface PlatformTransactionManager extends TransactionManager {
// 获取事务状态
TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
throws TransactionException;
// 提交事务
void commit(TransactionStatus status) throws TransactionException;
// 回滚事务
void rollback(TransactionStatus status) throws TransactionException;
}
核心接口关系
Java
┌─────────────────────────────────────────────────────┐
│ PlatformTransactionManager │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │getTransaction│ │ commit │ │ rollback │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────┘
↓ 实现
┌─────────────────────────────────────────────────────┐
│ DataSourceTransactionManager │
│ JpaTransactionManager │
│ HibernateTransactionManager │
│ JtaTransactionManager │
└─────────────────────────────────────────────────────┘
TransactionDefinition - 事务定义
Java
public interface TransactionDefinition {
// 传播行为
int getPropagationBehavior();
// 隔离级别
int getIsolationLevel();
// 超时时间
int getTimeout();
// 是否只读
boolean isReadOnly();
// 事务名称
String getName();
}
TransactionStatus - 事务状态
Java
public interface TransactionStatus extends SavepointManager, TransactionExecution {
// 是否是新事务
boolean isNewTransaction();
// 是否有保存点
boolean hasSavepoint();
// 设置仅回滚
void setRollbackOnly();
// 是否仅回滚
boolean isRollbackOnly();
// 是否已完成
boolean isCompleted();
// 创建保存点
Object createSavepoint() throws TransactionException;
// 回滚到保存点
void rollbackToSavepoint(Object savepoint) throws TransactionException;
// 释放保存点
void releaseSavepoint(Object savepoint) throws TransactionException;
}
常用实现类
DataSourceTransactionManager
Java
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/test");
ds.setUsername("root");
ds.setPassword("password");
return ds;
}
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
JpaTransactionManager
Java
@Configuration
@EnableJpaRepositories("com.example.repository")
public class JpaConfig {
@Bean
public PlatformTransactionManager transactionManager(
EntityManagerFactory entityManagerFactory) {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory);
return txManager;
}
}
多事务管理器
Java
@Configuration
public class MultiDataSourceConfig {
@Bean
@Primary
public DataSource primaryDataSource() {
return DataSourceBuilder.create()
.url("jdbc:mysql://localhost:3306/primary")
.build();
}
@Bean
public DataSource secondaryDataSource() {
return DataSourceBuilder.create()
.url("jdbc:mysql://localhost:3306/secondary")
.build();
}
@Bean
@Primary
public PlatformTransactionManager primaryTxManager(
@Qualifier("primaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public PlatformTransactionManager secondaryTxManager(
@Qualifier("secondaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
// 使用指定事务管理器
@Service
public class OrderService {
@Transactional("primaryTxManager")
public void saveToPrimary(Order order) { }
@Transactional(transactionManager = "secondaryTxManager")
public void saveToSecondary(Order order) { }
}
编程式事务
使用TransactionTemplate
Java
@Service
public class PaymentService {
@Autowired
private TransactionTemplate transactionTemplate;
public void processPayment(Payment payment) {
transactionTemplate.execute(status -> {
try {
accountDao.decrease(payment.getFromAccount(), payment.getAmount());
accountDao.increase(payment.getToAccount(), payment.getAmount());
} catch (Exception e) {
status.setRollbackOnly();
throw e;
}
return null;
});
}
// 有返回值的事务
public Long createOrder(OrderRequest request) {
return transactionTemplate.execute(status -> {
Order order = new Order(request);
orderDao.insert(order);
return order.getId();
});
}
}
直接使用PlatformTransactionManager
Java
@Service
public class ManualTxService {
@Autowired
private PlatformTransactionManager transactionManager;
public void manualTransaction() {
TransactionDefinition definition = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(definition);
try {
// 业务操作
doSomething();
// 提交
transactionManager.commit(status);
} catch (Exception e) {
// 回滚
transactionManager.rollback(status);
throw e;
}
}
}
保存点使用
text
@Service
public class BatchService {
@Autowired
private PlatformTransactionManager transactionManager;
public void batchWithSavepoint() {
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(definition);
try {
for (int i = 0; i < 10; i++) {
Object savepoint = status.createSavepoint();
try {
processItem(i);
} catch (Exception e) {
// 回滚到保存点,继续处理下一个
status.rollbackToSavepoint(savepoint);
status.releaseSavepoint(savepoint);
}
}
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
}
}
}
实现类对比
| 实现类 | 适用场景 | 数据源 |
|---|---|---|
| DataSourceTransactionManager | JDBC/MyBatis | 单数据源 |
| JpaTransactionManager | JPA | 单数据源 |
| HibernateTransactionManager | Hibernate | 单数据源 |
| JtaTransactionManager | 分布式事务 | 多数据源 |
要点总结
- PlatformTransactionManager是事务管理核心接口
- getTransaction/commit/rollback三个核心方法
- TransactionDefinition定义事务属性
- TransactionStatus跟踪事务状态
- 不同持久层框架使用对应的事务管理器
- TransactionTemplate简化编程式事务
📝 发现内容有误?点击此处直接编辑