嵌套事务分析@Transactional

本文深入探讨了Spring框架中@Transactional注解的两种主要事务传播类型:REQUIRED和REQUIRES_NEW。通过实例分析,阐述了在不同传播类型下,父事务与子事务之间的交互规则及异常处理机制。

嵌套事务分析@Transactional

事务类型总共有七种;在这就介绍常用的的两个。
@Transactional(propagation=Propagation.REQUIRED)//如果有事务,那么加入事务,没有的话新创建一个;不指定propagation默认就是这个
@Transactional(propagation=Propagation.REQUIREDS_NEW)//不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务,

Propagation.REQUIRED类型事务嵌套

A事务方法调用B事务方法时如果两个事务注解在生效的情况下,在这里A事务称为父类,B事务称为子类;A方法操作数据库后调用B方法,下列异常抛出时保证AB方法里对数据库操作都完成了才抛出异常;RuleException继承的RuntimeException;

列举一下测试结果:
在这里插入图片描述
总结:
1.如果子类方法抛出的异常,不管满足子类还是父类的注解的回滚事务就会回滚;
2.如果父类抛出异常,只看父类的事务注解,如果回滚就父子皆回滚,如果不回滚父子皆不回滚

嵌套事务类型是Propagation.REQUIRES_NEW

这种情况下子事务开启了新的session,父事务先锁定一条记录(for update)子事务也锁这一条记录时就会死锁;这点要注意;

### 关于 @Transactional 事务提交慢的原因分析 #### 可能原因 1. **数据库锁竞争** 当多个线程或进程同时访问同一资源时,可能导致数据库锁的竞争。如果某些操作长时间持有锁,则会阻塞其他事务的执行,从而导致整体事务提交变慢[^1]。 2. **SQL 执行效率低下** 如果事务中的 SQL 查询或更新语句存在性能瓶颈(如缺少索引、全表扫描等),则可能显著延长事务的执行时间。这不仅影响当前事务,还可能引发连锁反应,进一步拖慢整个系统的响应速度[^2]。 3. **网络延迟** 数据库与应用程序之间的通信可能存在高延迟问题,尤其是在分布式环境中。这种情况下,每次交互都会增加额外的时间开销,进而影响事务的整体表现[^3]。 4. **日志写入压力** 默认情况下,大多数关系型数据库会在每次事务提交时将更改记录到磁盘上的重做日志文件中。如果日志写入频繁或者存储设备性能不足,则可能会成为性能瓶颈之一[^1]。 5. **隔离级别过高** 设置过高的事务隔离级别虽然可以减少脏读等问题的发生概率,但也增加了并发控制的成本。例如,在 SERIALIZABLE 隔离模式下运行大量复杂查询往往会导致严重的性能下降。 6. **嵌套事务不当配置** 虽然 Spring 支持嵌套事务功能,但如果未合理设置 `nestedTransactionAllowed` 参数 或者错误理解其工作原理,则容易造成不必要的回滚点创建以及其他副作用,最终降低效率。 --- ### 解决方案及优化措施 1. **调整数据库连接池参数** 合理规划最大活跃连接数、等待超时时间和预取大小等关键指标,确保能够满足高峰期负载需求的同时避免浪费系统资源。 2. **改进 SQL 性能** 定期审查并优化涉及的所有查询逻辑,添加适当索引来加速检索过程;对于批量插入/删除操作考虑采用更高效的方法代替逐条处理。 3. **启用异步提交 (Asynchronous Commit)** 对于那些对一致性要求不那么严格的应用场景来说,允许部分数据暂时处于不可见状态直到完全确认后再同步可见或许是一个不错的选择。这样可以在一定程度上缓解因持久化带来的延时困扰。 4. **降低默认隔离等级** 根据实际业务特点重新评估现有设定是否有必要维持如此严格的约束条件,并尝试切换至较低级别的选项比如 READ_COMMITTED 来换取更好的吞吐量表现 5. **利用只读事务特性** 将那些仅仅用于读取而不修改任何内容的操作标记为 readonly=true 属性值 ,以便让框架自动跳过一些耗时步骤如生成 undo log 等动作来提升速率 6. **加强硬件设施投入力度** 升级服务器型号选用更快更强力 的 CPU/GPU 组件 加大内存容量 提升硬盘I/O能力等等都是可行手段 7. **引入缓存机制减轻后台负担** 缓存热点数据减少重复请求次数缩短相应周期提高用户体验满意度 8. **定期清理无用历史记录保持整洁环境** 删除陈旧冗余的数据对象释放空间腾出更多可用额度供新资料储存使用 ```java @Bean public PlatformTransactionManager transactionManager(DataSource dataSource) { DataSourceTransactionManager tm = new DataSourceTransactionManager(dataSource); tm.setValidateExistingTransaction(true); // 检查已有事务是否存在冲突 tm.setNestedTransactionAllowed(true); // 开启支持嵌套事务的能力 return tm; } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值