java八股-Spring中的事务是如何实现的?AOP原理
Spring中的事务是如何实现的?
Spring中的事务管理主要有两种方式:编程式事务管理和声明式事务管理。下面分别介绍这两种方式的实现机制:
编程式事务管理
编程式事务这种比较low B,也已经out了
编程式事务管理是指通过编程的方式直接使用PlatformTransactionManager
接口来管理事务。这种方式需要开发者直接处理事务的创建、提交和回滚等操作,代码侵入性较强。
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
public class ProgrammingTransactionManagement {
private PlatformTransactionManager transactionManager;
public void executeInTransaction() {
// 定义事务属性
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
// 获取事务状态对象
TransactionStatus status = transactionManager.getTransaction(def);
try {
// 执行业务逻辑
// ...
// 提交事务
transactionManager.commit(status);
} catch (Exception ex) {
// 回滚事务
transactionManager.rollback(status);
throw ex;
}
}
}
声明式事务管理
如何理解声明式事务基于AOP来完成?@Transactional
就是一个简单粗暴的切入点。
其本质是通过AOP功能,对方法前后进行拦截,在执行方法之前开启事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
下面是可能的 系统切面类,因此说声明式事务管理基于AOP
import java.lang.reflect.Method;
//标注切面类
@Aspect
@Component
public class XXX {
private PlatformTransactionManager transactionManager;
//切入注解名字
@Pointcut("@annotation(com.xxx.javaaopdemo.xxxx)")
public void pointCut(){
//找到切点
}
//绑定上面的pointCut方法
@Around("pointCut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
// 定义事务属性
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
// 获取事务状态对象
TransactionStatus status = transactionManager.getTransaction(def);
try{
//执行该方法前的通用逻辑.......
// **** before use the method
Object obj = joinPoint.proceed();
//执行该方法之后的通用逻辑.....
// **** after use the method
transactionManager.commit(status);
}catch(Exception ex){
transactionManager.rollback(status);
}
//切点方法返回值
return obj;
}
}
声明式事务管理是通过在代码中添加注解或者在配置文件中使用XML配置来实现事务管理,这种方式更加简洁,且代码侵入性小。
-
使用
@Transactional
注解:
声明式事务管理最常用的方式是在方法上添加@Transactional
注解。Spring会根据注解的属性自动进行事务的创建、提交和回滚。下面是注入了@Transaction的方法import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class MyService { @Transactional public void myTransactionalMethod() { // 业务逻辑代码 } }
-
AOP实现:
@Transactional
注解的工作原理基于Spring AOP。Spring会在运行时为被@Transactional
注解的方法创建一个代理对象,这个代理对象会在方法执行前后添加事务管理逻辑。Spring事务的AOP实现大致步骤如下:
- 创建代理:Spring容器在创建Bean时,如果发现Bean上标注了
@Transactional
注解,会为这个Bean创建一个代理对象。 - 拦截器链:当代理对象的方法被调用时,Spring会根据AOP的拦截器链来处理方法调用。
- 事务增强:Spring会为
@Transactional
注解的方法创建一个事务增强(TransactionInterceptor),这个增强会在目标方法执行前后添加事务管理逻辑。 - 事务管理:事务增强会使用
PlatformTransactionManager
来管理事务的提交和回滚。
- 创建代理:Spring容器在创建Bean时,如果发现Bean上标注了
-
事务属性:
@Transactional
注解支持多个属性,如propagation
(传播行为)、isolation
(隔离级别)、timeout
(超时时间)、readOnly
(只读)、rollbackFor
和noRollbackFor
(定义哪些异常会导致事务回滚)等,允许开发者自定义事务的行为。
通过声明式事务管理,Spring提供了一种简洁且强大的事务管理机制,使得开发者可以轻松地在应用中实现事务控制,保证数据的一致性和完整性。
如果有不懂AOP的可参考下面的
https://blog.csdn.net/weixin_46028606/article/details/143689162?fromshare=blogdetail&sharetype=blogdetail&sharerId=143689162&sharerefer=PC&sharesource=weixin_46028606&sharefrom=from_link
原文地址:https://blog.csdn.net/weixin_46028606/article/details/143896284
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!