Spring原理篇(16)--Spring事务的实现;

boolean execute = statement.execute(“INSERT INTO student (id,student_name) VALUES (‘1’,‘1’)”);

“得到结果”

ResultSet rs = ps.executeQuery();

“忽略关闭数据库 操作…”

}

}

这就是我们普通连接数据库并且执行的语句;这样如果在保存成功之后 发生了错误.那么 数据已经持久化在数据库中了 这时候就会比较麻烦 我们怎么办?

Connection conn = DriverManager.getConnection(…);

conn.setAutoCommit(false);

“执行sql”

“手动提交”

conn.commit();

Spring Transactional 就是帮我们做了这么一件事情;

我们把JdbcTemplate 交给Spring管理;

接下来我们开始进入今天的主题

Transactional

=========================================================================

在我们的方法中 我们只要加入了@Transactional 注解 代表着我们已经对这个方法里面执行的所有sql开启了事务;

为什么我会在AOP 讲解之后讲 Spring Transactional; 因为它就是基于Spring AOP来实现的;

Spring 开启事务 本质上就是 增加了一个Advisor 一个Advisor 是由一个Advice 和一个 Pointcut构成的.

这个在之前AOP的时候 很明确的表明了这个观点;

@EnableTransactionManagement 原理

===========================================================================================

它的作用主要是向Spring容器中添加了两个Bean:

  1. AutoProxyRegistrar

  2. ProxyTransactionManagementConfiguration

AutoProxyRegistrar:主要的作用是向Spring容器中注册了一个 InfrastructureAdvisorAutoProxyCreator的Bean。 而InfrastructureAdvisorAutoProxyCreator 继承了AbstractAdvisorAutoProxyCreator,所以这个类的主要作用就是开启自动代理的作用,也 就是一个BeanPostProcessor,会在初始化后步骤中去寻找Advisor类型的Bean,并判断当前某个 Bean是否有匹配的Advisor,是否需要利用动态代理产生一个代理对象。

ProxyTransactionManagementConfiguration 主要作用是定义了三个Bean :

1.BeanFactoryTransactionAttributeSourceAdvisor; 看结尾就很容易看出来 是一个Advisor;

2.AnnotationTransactionAttributeSource:相当于 上面那个Advisor中的Pointcut

3.TransactionInterceptor:相当于BeanFactoryTransactionAttributeSourceAdvisor中的 Advice

记忆顺序 1,2,3 木头人

(一)EnableTransactionManagement 注册 (二)AutoProxyRegistrar 和 (二)ProxyTransactionManagementConfiguration

(二)AutoProxyRegistrar 注册 (木头人)InfrastructureAdvisorAutoProxyCreator 去开启自动代理 找Advisor类型的Bean.

(二)ProxyTransactionManagementConfiguration 生成

BeanFactoryTransactionAttributeSourceAdvisor ----Advisor

AnnotationTransactionAttributeSource —Pointcut

TransactionInterceptor ----Advice

一个注解注册两个bean 一个Bean又创建三个对象 还有一个木头人去找Advisor类型的Bean. 三个对象分别为Advisor Pointcut Advice; Pointcut 去判断 类上 或者方法上是否有@Transactional注解 Advice 在寻找到该切点的时候 执行里面的invoke()方法;


Spring 事务的基本执行原理


当我们的Bean 在初始化过后;就会进过 (木头人) InfrastructureAdvisorAutoProxyCreator 木头人给判断它是否有@Transactional注解.如果有就生成动态代理;

当我们执行代理对象的被代理方法的时候. 就会调用TransactionInterceptor的invoke()方法;

他们两者 都需要经过 BeanFactoryTransactionAttributeSourceAdvisor 进行匹配判断;.

这样 三个对象都解释清楚了


最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们

目录:

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

Java面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!**

[外链图片转存中…(img-l1AgNoKW-1719175640378)]

Java面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了

[外链图片转存中…(img-iB9elP7n-1719175640379)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值