【Java ArrayList】底层方法的自我实现

📅 发布时间:2026/7/9 20:46:28 👁️ 浏览次数:
【Java ArrayList】底层方法的自我实现
【JAVA 进阶】Spring Boot 事务深度解析从理论到实践的完整指南Spring Boot 中的事务管理是构建可靠企业级应用的核心尤其在处理数据库操作时确保数据一致性和完整性。本指南从事务理论基础入手逐步深入到Spring Boot 的实现机制、注解详解、常见坑点、实践代码和高级扩展帮助你从新手到高手。基于 Spring Boot 3.x2026 年主流版本结合 MySQL / JPA 示例。1. 事务理论基础ACID 与 CAPACID 属性事务的四个核心特性事务Transaction是数据库操作的原子单元确保以下属性属性描述示例场景Atomicity原子性全部成功或全部失败转账扣款 加款必须一起成功Consistency一致性事务前后数据一致业务约束余额不能为负Isolation隔离性事务间互不干扰并发读写不冲突Durability持久性提交后永久保存宕机后数据不丢隔离级别解决并发问题隔离级别从低到高平衡一致性与性能隔离级别脏读不可重复读幻读性能影响READ UNCOMMITTED是是是最高几乎不用READ COMMITTED否是是高Oracle 默认REPEATABLE READ否否是中MySQL 默认SERIALIZABLE否否否最低串行执行脏读读到未提交数据不可重复读同事务内多次读不一致幻读同事务内范围查询结果变化Spring 默认隔离级别DEFAULT跟随数据库默认通常 REPEATABLE READ。CAP 定理分布式事务相关CConsistency一致性AAvailability可用性PPartition tolerance分区容忍性分布式系统无法同时满足三者通常选择 AP 或 CP。Spring Boot 分布式事务常采用 BASEBasically Available, Soft state, Eventually consistent。2. Spring Boot 事务管理机制Spring Boot 通过Spring TX模块管理事务支持声明式注解和编程式TransactionTemplate两种方式。底层基于 AOP代理实现。关键组件PlatformTransactionManager事务管理器接口核心。Spring Boot 自动配置JPAJpaTransactionManagerJDBCDataSourceTransactionManagerTransactionDefinition定义传播行为、隔离级别等EnableTransactionManagement启用事务Spring Boot 默认开启声明式事务 vs 编程式事务类型优点缺点使用场景声明式Transactional简单、非侵入性灵活性低、易失效80% 场景编程式TransactionTemplate精细控制代码侵入复杂逻辑3. Transactional 注解详解基本用法ServicepublicclassUserService{AutowiredprivateUserRepositoryuserRepository;Transactional// 默认传播 REQUIRED、隔离 DEFAULT、读写事务publicvoidupdateUser(Useruser){// 操作1userRepository.save(user);// 操作2如果异常回滚所有if(true)thrownewRuntimeException(模拟异常);}}核心参数参数默认值描述示例propagationREQUIRED传播行为见下表Propagation.MANDATORYisolationDEFAULT隔离级别Isolation.READ_COMMITTEDtimeout-1无限超时秒数30readOnlyfalse只读事务优化性能truerollbackForRuntimeException / Error回滚异常类{BusinessException.class}noRollbackFor无不回滚异常类{IgnoreException.class}传播行为Propagation详解控制事务嵌套时的行为方法 A 调用方法 B行为描述场景REQUIRED默认支持当前事务无则新建标准嵌套REQUIRES_NEW总是新建事务挂起当前独立事务SUPPORTS支持当前无则非事务可选事务MANDATORY必须有当前事务否则抛异常强制事务NOT_SUPPORTED非事务执行挂起当前无事务NEVER必须无事务否则抛异常禁止事务NESTED嵌套事务保存点异常只回滚子事务部分回滚4. 事务失效常见场景及解决方案事务失效是面试高频点通常因 AOP 代理失效导致。场景原因解决方案本类方法调用内部调用不走代理1. 注入自身Autowired Self self; self.txMethod()2. AopContext.currentProxy()3. 拆分类非 public 方法AOP 默认只代理 public改 public 或用 CGLIB 代理checked 异常默认只回滚 RuntimeException添加 rollbackFor Exception.class读写分离失效readOnlytrue 时写操作失败正确设置 readOnly多数据源默认单数据源配置多 TransactionManager异步方法异步线程无事务上下文手动传播 TransactionSynchronizationManager5. 实践示例从简单到复杂环境准备pom.xml application.yml!-- pom.xml --dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-jpa/artifactId/dependencydependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactId/dependency/dependencies# application.ymlspring:datasource:url:jdbc:mysql://localhost:3306/testdbusername:rootpassword:rootjpa:hibernate:ddl-auto:update实体与 RepositoryEntitypublicclassUser{IdGeneratedValueprivateLongid;privateStringname;privateintbalance;// getter/setter}RepositorypublicinterfaceUserRepositoryextendsJpaRepositoryUser,Long{}简单事务实践ServicepublicclassTransferService{AutowiredprivateUserRepositoryuserRepository;Transactional(rollbackForException.class)publicvoidtransfer(LongfromId,LongtoId,intamount){UserfromuserRepository.findById(fromId).orElseThrow();UsertouserRepository.findById(toId).orElseThrow();from.setBalance(from.getBalance()-amount);to.setBalance(to.getBalance()amount);userRepository.save(from);userRepository.save(to);if(amount100)thrownewRuntimeException(模拟异常);// 测试回滚}}编程式事务实践ServicepublicclassProgrammaticService{AutowiredprivateTransactionTemplatetransactionTemplate;publicvoidupdateInTx(Useruser){transactionTemplate.execute(status-{// 操作try{// ...}catch(Exceptione){status.setRollbackOnly();// 手动回滚}returnnull;});}}嵌套事务实践ServicepublicclassNestedService{Transactional(propagationPropagation.REQUIRED)publicvoidouterMethod(){// 操作 AinnerMethod();// 注意本类调用失效除非用代理// 操作 B}Transactional(propagationPropagation.NESTED)publicvoidinnerMethod(){// 子事务操作}}6. 高级扩展分布式事务单机事务无法满足微服务场景常见方案XA / 2PCSpring Boot Atomikos / Bitronix同步阻塞性能差Seata阿里开源支持 AT / TCC / Saga 模式推荐可靠消息最终一致性MQ如 RocketMQ 补偿机制SAGA长事务补偿适用于复杂业务Seata 示例集成添加依赖dependencygroupIdio.seata/groupIdartifactIdseata-spring-boot-starter/artifactIdversion1.8.0/version/dependency配置 seata.conf / registry.conf使用GlobalTransactionalGlobalTransactionalpublicvoidglobalTx(){// 跨服务调用}7. 性能优化与监控只读事务Transactional(readOnlytrue) → 优化锁事务边界最小化事务方法避免大事务监控Spring Boot Actuator Micrometer → 暴露事务指标测试DataJpaTest Transactional → 单元测试回滚总结一句话行动指南掌握 Transactional 的传播与隔离避开本类调用失效坑先用声明式事务建简单 CRUD再用编程式/分布式扩展复杂场景就能高效驾驭 Spring Boot 事务。有具体场景想深入如多数据源事务、Seata 完整 demo、或某个失效坑的代码复现告诉我我可以继续展开