Spring事务原理:
Spring事务通过AOP(面向切面编程)和代理模式实现。Spring事务管理器使用了代理模式,对需要进行事务管理的方法进行代理,从而在方法执行前后添加了事务处理的逻辑。Spring事务管理器通过使用底层的数据库事务管理机制(如JDBC事务或JTA事务)来实现事务的提交、回滚和隔离级别的控制。
Spring事务失效场景:
-
未开启事务注解:如果在方法上没有使用
@Transactional注解,或者在类上没有配置@EnableTransactionManagement,则Spring无法识别并管理事务,事务将失效。 -
异常未被捕获:如果方法中抛出的异常未被捕获,或者被捕获后没有抛出新的异常,Spring无法感知到异常的发生,事务无法被回滚。
-
异步方法:如果使用
@Async注解将方法标记为异步方法,Spring事务管理器无法拦截异步方法,事务将失效。 -
方法内部自调用:如果在同一个类中的方法内部进行自调用,Spring事务管理器无法拦截自调用的方法,事务将失效。
Spring事务的隔离级别:
Spring事务的隔离级别定义了事务之间的隔离程度,包括以下几种级别:
- DEFAULT:使用底层数据库的默认隔离级别。
- READ_UNCOMMITTED:允许读取未提交的数据,可能导致脏读、不可重复读和幻读的问题。
- READ_COMMITTED:只能读取已提交的数据,可以避免脏读,但可能出现不可重复读和幻读的问题。
- REPEATABLE_READ:保证在同一事务中多次读取相同数据时,结果始终一致,可以避免脏读和不可重复读,但可能出现幻读的问题。
- SERIALIZABLE:最高的隔离级别,保证在并发环境下事务之间不会出现任何问题,但性能较差。
Spring事务的传播行为:
Spring事务的传播行为定义了在多个事务方法相互调用时,事务如何传播和管理。包括以下几种传播行为:
- REQUIRED:如果当前存在事务,则加入到当前事务中;如果当前没有事务,则新建一个事务。
- SUPPORTS:如果当前存在事务,则加入到当前事务中;如果当前没有事务,则以非事务方式执行。
- MANDATORY:必须在当前存在事务的情况下执行,否则抛出异常。
- REQUIRES_NEW:无论当前是否存在事务,都新建一个事务,并在新事务中执行。
- NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则挂起事务。
- NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。
- NESTED:在当前事务中创建一个嵌套事务,如果当前没有事务,则新建一个事务。
通过设置合适的隔离级别和传播行为,可以灵活地管理Spring事务,以满足不同的需求。

被折叠的 条评论
为什么被折叠?



