概述
Spring事务钩子是一套强大的机制,这些钩子提供了对事务管理的细粒度控制,允许开发者在事务生命周期的不同阶段执行自定义逻辑。
主要的事务钩子类型
1. TransactionSynchronization(事务同步器)
TransactionSynchronization是最核心的事务钩子接口,提供了以下回调方法:
核心方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public interface TransactionSynchronization { int STATUS_COMMITTED = 0; int STATUS_ROLLED_BACK = 1; int STATUS_UNKNOWN = 2; void suspend(); void resume(); void flush(); void beforeCommit(boolean readOnly); void beforeCompletion(); void afterCompletion(int status); }
|
使用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @Component public class OrderTransactionSynchronization implements TransactionSynchronization { @Override public void beforeCommit(boolean readOnly) { logger.info("准备提交事务"); } @Override public void afterCompletion(int status) { if (status == STATUS_COMMITTED) { logger.info("事务提交成功"); } else if (status == STATUS_ROLLED_BACK) { logger.warn("事务回滚"); } } }
|
2. TransactionalEventListener(事务事件监听器)
Spring 4.2+引入了@TransactionalEventListener注解,允许在事务的不同阶段监听事件:
事务阶段
BEFORE_COMMIT: 事务提交前
AFTER_COMMIT: 事务提交后
AFTER_ROLLBACK: 事务回滚后
AFTER_COMPLETION: 事务完成后(无论提交还是回滚)
TransactionalEventListener的使用
1. 钩子注册(订单创建示例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @Transactional public OrderResponse createOrder(OrderRequest request) { String orderId = generateOrderId(); OrderTransactionSynchronization.registerSynchronization(orderId, "CREATE_ORDER"); eventPublisher.publishEvent(new OrderCreatedEvent(order)); return OrderResponse.success(order, productName, "订单创建成功"); }
|
2. 异步审计日志
1 2 3 4 5
| @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) public void auditOrderCreation(OrderCreatedEvent event) { auditService.logOrderCreation(event.getOrder()); }
|
2. 异步缓存更新
1 2 3 4 5
| @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) public void updateCache(OrderCreatedEvent event) { cacheService.evictUserOrders(event.getUserId()); }
|
3. 异步消息通知
1 2 3 4 5
| @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) public void sendNotification(OrderCreatedEvent event) { notificationService.sendOrderConfirmation(event.getOrder()); }
|
4. 异步补偿操作
1 2 3 4 5
| @TransactionalEventListener(phase = TransactionPhase.AFTER_ROLLBACK) public void handleOrderFailure(OrderCreatedEvent event) { compensationService.handleOrderFailure(event.getOrder()); }
|
注意事项
1. 性能考虑
- 同步事务器的钩子会在每个事务中执行,会阻塞事务线程的进行,避免在钩子中执行耗时操作
- 考虑使用异步处理(线程池)或者事务监听器的方式来避免阻塞事务
2. 异常处理
- 需要在钩子中妥善处理异常,否则会影响正常事务的执行
3. 事务传播
- 钩子只在当前事务中生效
- 新事务不会继承父事务的钩子
核心类:TransactionSynchronizationManager
TransactionSynchronizationManager是Spring事务钩子的核心管理类,负责管理事务同步钩子的注册、执行和清理。
核心原理
TransactionSynchronizationManager使用ThreadLocal来存储当前线程的事务同步钩子,确保每个事务线程都有独立的钩子集合。
1 2 3 4 5 6 7 8 9 10 11 12 13
| public abstract class TransactionSynchronizationManager { private static final ThreadLocal<Set<TransactionSynchronization>> synchronizations = new NamedThreadLocal<>("Transaction synchronizations"); private static final ThreadLocal<Boolean> actualTransactionActive = new NamedThreadLocal<>("Actual transaction active"); private static final ThreadLocal<String> currentTransactionName = new NamedThreadLocal<>("Current transaction name"); }
|
主要方法
1. 钩子注册和管理
1 2 3 4 5 6 7 8 9 10 11
| public static boolean isSynchronizationActive()
public static void registerSynchronization(TransactionSynchronization synchronization)
public static Set<TransactionSynchronization> getSynchronizations()
public static void clearSynchronization()
|
2. 事务状态管理
1 2 3 4 5 6 7 8 9 10 11
| public static boolean isActualTransactionActive()
public static void setActualTransactionActive(boolean active)
public static String getCurrentTransactionName()
public static void setCurrentTransactionName(String name)
|
3. 资源绑定管理
1 2 3 4 5 6 7 8 9 10 11
| public static void bindResource(Object key, Object value)
public static Object getResource(Object key)
public static Object unbindResource(Object key)
public static boolean hasResource(Object key)
|
TransactionSynchronizationManager实际应用示例
1. 基础钩子注册
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Service public class OrderService { @Transactional public OrderResponse createOrder(OrderRequest request) { if (TransactionSynchronizationManager.isSynchronizationActive()) { TransactionSynchronizationManager.registerSynchronization( new OrderTransactionSynchronization(request.getOrderId(), "CREATE_ORDER") ); } return processOrder(request); } }
|
2. 资源绑定示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| @Service public class OrderService { @Transactional public OrderResponse createOrder(OrderRequest request) { String orderId = generateOrderId(); TransactionSynchronizationManager.bindResource("orderId", orderId); TransactionSynchronizationManager.bindResource("userId", request.getUserId()); try { return processOrder(request); } finally { TransactionSynchronizationManager.unbindResource("orderId"); TransactionSynchronizationManager.unbindResource("userId"); } } }
|
3. 事务状态检查
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| @Component public class OrderTransactionSynchronization implements TransactionSynchronization { @Override public void beforeCommit(boolean readOnly) { if (TransactionSynchronizationManager.isActualTransactionActive()) { String transactionName = TransactionSynchronizationManager.getCurrentTransactionName(); logger.info("准备提交事务: {}", transactionName); } } @Override public void afterCompletion(int status) { String orderId = (String) TransactionSynchronizationManager.getResource("orderId"); Long userId = (Long) TransactionSynchronizationManager.getResource("userId"); if (status == STATUS_COMMITTED) { logger.info("订单创建成功: orderId={}, userId={}", orderId, userId); } else { logger.warn("订单创建失败: orderId={}, userId={}", orderId, userId); } } }
|