网站首页 > java教程 正文
一、事务基础设施的三层架构
1. 声明式事务的入口:@Transactional的元数据解析
java
// Spring通过BeanPostProcessor处理注解
public class AnnotationTransactionAttributeSource
extends AbstractFallbackTransactionAttributeSource {
// 解析方法级别的@Transactional注解
protected TransactionAttribute findTransactionAttribute(Method method) {
return determineTransactionAttribute(method);
}
// 类级别注解继承机制
protected TransactionAttribute findTransactionAttribute(Class<?> clazz) {
// ...
}
}
核心机制:
- 使用TransactionAnnotationParser解析注解属性(隔离级别、传播行为、超时等)
- 通过TransactionAttribute对象封装事务元数据
- 继承规则:方法级注解覆盖类级注解,接口注解默认不生效
2. AOP代理的生成策略
- JDK动态代理:基于接口实现,生成$Proxy类
- CGLIB字节码增强:通过生成子类覆盖父类方法
- Spring Boot 2.x后默认优先使用CGLIB代理
关键源码路径:
java
// AbstractAutoProxyCreator#createProxy
protected Object createProxy(Class<?> beanClass, String beanName,
Object[] specificInterceptors, TargetSource targetSource) {
// 判断是否强制使用CGLIB
if (this.proxyTargetClass || shouldProxyTargetClass(beanClass, beanName)) {
return buildCglibProxy(beanClass, beanName);
} else {
return buildJdkDynamicProxy(beanClass, name);
}
}
二、事务管理器(PlatformTransactionManager)的运作机制
1. 事务生命周期控制
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;
}
2.
DataSourceTransactionManager的核心实现
java
public class DataSourceTransactionManager extends AbstractPlatformTransactionManager
implements ResourceTransactionManager {
// 关键方法:获取数据库连接
protected void doBegin(Object transaction, TransactionDefinition definition) {
DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction;
Connection con = null;
try {
// 从数据源获取连接
con = obtainDataSource().getConnection();
// 设置隔离级别
Integer previousIsolationLevel = DataSourceUtils.prepareConnectionForTransaction(
con, definition);
// 关闭自动提交
if (con.getAutoCommit()) {
con.setAutoCommit(false);
}
// 绑定到线程上下文
txObject.setConnectionHolder(new ConnectionHolder(con), true);
}
// ...
}
}
核心流程:
- 通过TransactionSynchronizationManager绑定ConnectionHolder到ThreadLocal
- 事务传播行为决策树(PROPAGATION_REQUIRED/NESTED等)
- 保存点机制实现嵌套事务(SavepointManager)
三、事务拦截器(TransactionInterceptor)的拦截链
1. 方法调用拦截时序图
java
public Object invoke(MethodInvocation invocation) throws Throwable {
// 获取事务属性
TransactionAttributeSource tas = getTransactionAttributeSource();
final TransactionAttribute txAttr = tas.getTransactionAttribute(
invocation.getMethod(), invocation.getThis().getClass());
// 创建事务
TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
try {
// 执行目标方法
Object retVal = invocation.proceed();
// 提交事务
commitTransactionAfterReturning(txInfo);
return retVal;
} catch (Throwable ex) {
// 回滚决策
completeTransactionAfterThrowing(txInfo, ex);
throw ex;
}
}
2. 事务回滚规则引擎
- RollbackRuleAttribute解析异常类型
- 默认只回滚RuntimeException和Error
- 自定义规则示例:
java
@Transactional(rollbackFor = {BusinessException.class, SQLException.class})
四、事务同步与资源管理
1. 事务同步回调机制
java
复制
public abstract class TransactionSynchronizationManager {
private static final ThreadLocal<Map<Object, Object>> resources =
new NamedThreadLocal<>("Transactional resources");
private static final ThreadLocal<Set<TransactionSynchronization>> synchronizations =
new NamedThreadLocal<>("Transaction synchronizations");
}
2. 典型应用场景:
- 在事务提交后执行日志记录
- 事务回滚时发送告警通知
- 实现Hibernate的session自动flush
自定义同步器示例:
java
TransactionSynchronizationManager.registerSynchronization(
new TransactionSynchronization() {
@Override
public void afterCommit() {
auditService.logTransactionSuccess();
}
}
);
五、分布式事务的Spring实现
1. JTA事务管理器整合
xml
复制
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager"/>
</bean>
2. 基于XA协议的两阶段提交
- 阶段一:准备阶段(所有RM返回ready)
- 阶段二:提交/回滚(协调全局决策)
3. 柔性事务解决方案
- TCC模式(Try-Confirm-Cancel)
- Saga长事务模式
- 最大努力通知型
六、性能优化关键点
1. 事务粒度的控制
- 避免在事务中进行远程调用
- 批量操作使用BATCH_SIZE优化
- 合理设置事务超时时间
2. 连接池配置建议
properties
# HikariCP推荐配置
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
3. 事务监控指标
- 事务平均耗时
- 事务成功率
- 事务回滚率
- 死锁检测频率
七、常见问题排查指南
1. 事务不生效的7种场景:
- 非public方法使用@Transactional
- 异常类型不符合回滚规则
- 自调用导致代理失效
- 多数据源未指定事务管理器
- 使用错误的事务传播属性
- 数据库引擎不支持事务(如MyISAM)
- 线程切换导致连接丢失
2. 事务死锁检测工具:
- MySQL的SHOW ENGINE INNODB STATUS
- JDBC驱动的Connection#getWarnings()
- Spring的TransactionSynchronizationManager调试模式
总结与最佳实践
- 事务设计原则:保持事务短小、避免嵌套、合理设置隔离级别
- 监控体系:建立全链路事务监控看板
- 代码规范:强制事务注解必须显式指定rollbackFor
- 架构演进:单体事务→分布式事务→最终一致性方案
通过jdbcTemplate.execute("SHOW VARIABLES LIKE 'tx_isolation'")可验证当前事务隔离级别,结合Spring的TransactionTemplate进行编程式事务控制,可在复杂场景下实现更精细的事务管理。理解底层原理后,开发者应能根据业务特点选择合适的事务策略,在保证数据一致性的同时实现系统的高性能。
猜你喜欢
- 2025-05-14 Java项目中注解的高效使用指南
- 2025-05-14 SpringBoot注解速查手册:涵盖107个核心注解
- 2025-05-14 Java批量导入时,如何去除重复数据并返回结果?
- 2025-05-14 Java Spring 常用注解详解
- 2025-05-14 惊艳于红警开源代码?赏心悦目的代码注释,我们也可以
- 2025-05-14 从asp.net到jsp:3分钟看透Jsp&Servlet
- 2025-05-14 Idea超实用的自定义注释模板,一键注释,简化开发
- 2025-05-14 C++ 第一个程序、注释、常量
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)