在Spring事务管理下,使用Synchronized 为什么会出现并发问题

理解了Spring事务实现原理, 现在来解决一个实际问题。 在实际业务开发中,我们经常会遇到在一个事务内执行多个业务操作保证原子性, 同时希望这段逻辑是并发安全的。 比如在商品售卖场景中,非常重要的一件事就是防止超卖,且要保证多个业务操作之间的原子性。以下示例代码,明显会出现超卖问题(查询是否有库存时有库存并不代码真正扣减库存时还有库存,假设扣减库存时SQL 中没有乐观锁) 12345678...

Spring事务实现原理

1. 数据库事务1.1 数据库事务实现原理Spring提供了灵活方便的事务管理功能,但这些功能都是基于底层数据库本身的事务处理机制工作的。要想深入了解Spring的事务管理和配置,有必要先学习数据库事务的基础知识。有需要可以阅读以下文章Intro to 事务Intro to InnoDB事务InnoDB事务-原子性的实现, undo logInnoDB事务-隔离性的实现, MVCC &a...

Spring中三级缓存无法解决的循环依赖

建议了解以下内容后再阅读本文 Spring IOC容器 和 Spring beanSpring IOC 容器启动过程拓展点Spring bean 实例化Java 动态代理Spring AOP 实践Spring AOP XML配置方式原理详解Spring AOP 注解方式原理详解 关于Spring 循环依赖, 在 Spring bean 实例化一文中讲解了使用三级缓存+暴露早期引用机制 解决...

理解 Spring FacrotyBean

FactoryBean 和BeanFactory 名字太像了,以至于容易混淆,但是从功能上讲完全不一样, 理解了它们各自的功能就可以完美区分这俩了 1. BeanFactorySpring IOC 容器,用于管理bean ,具体细节已经在Spring bean 实例化中介绍过,就不再赘述,可以点击去阅读。 总的来说BeanFactory 时Spring 容器,在Spring的启动过程,Fa...

Spring AOP 注解方式原理详解

本文基于Spring AOP 实践 和 Spring AOP XML配置方式原理详解, 来继续讲解 基于注解方式实现AOP 自动代理的原理。 在Spring AOP 实践一文中,我们探讨了通过在XML配置文件中使用ProxyFactoryBean来配置代理对象的方法,并在需要时手动获取代理对象以实现AOP功能。 然而,在大型生产环境中,这种配置方式显得繁琐且不切实际。为了解决这一问题,Sp...

Spring AOP XML配置方式原理详解

本文重点分析 Spring AOP 实践一文中,通过ProxyFactoryBean手动配置动态代理的实现原理。 原理分析将基于以下示例代码。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051public class UserService { ...

Spring 启动过程 拓展点

Spring框架提供了丰富的扩展点,允许开发者在bean的生命周期的不同阶段插入自定义逻辑,从而增强应用的功能和灵活性。拓展点包括BeanFactoryPostProcessor、BeanPostProcessor、各种Aware等。下面来具体讲解各个拓展点的作用以及它们是如何介入到bean 的生命周期中。 除了Aware接口和BeanPostProcessor,还有许多其他扩展点,如Bea...

Spring AOP 实践

1. 为什么需要AOP关于消除重复代码,定义公共父类使用继承的方式实现是一种常见的思路。但是例如性能监控、事务管理,这类重复代码的特点是和业务代码紧密结合在一起,无法通过继承的方式解决。 比如在程序运行中,想计算每个方法的行时间, 就没有办法通过继承的方式去消除这类重复代码 12345678910111213141516171819202122public class UserServic...

Spring bean 实例化过程

在Spring IOC 容器 和 Spring bean 一文中,介绍了Spring IOC 容器和bean 一些相关基础知识。 Spring IOC 容器的作用是 管理 Bean 的生命周期,控制 Bean 的依赖注入。 本文内容将具体介绍Spring IOC 容器是如何管理bean 的生命周期和bean 之间的依赖关系的。 先来看一张整体框架图 读取Bean配置信息:Spring容器首...