当前位置: 首页 > news >正文

芜湖集团网站建设百度网页推广

芜湖集团网站建设,百度网页推广,wordpress新站5天收录,昆明做网站竞价Spring之事务底层源码解析 1、EnableTransactionManagement工作原理 开启 Spring 事务本质上就是增加了一个 Advisor,当我们使用 EnableTransactionManagement 注解来开启 Spring 事务时,该注解代理的功能就是向 Spring 容器中添加了两个 Bean&#xf…

Spring之事务底层源码解析

1、@EnableTransactionManagement工作原理

开启 Spring 事务本质上就是增加了一个 Advisor,当我们使用 @EnableTransactionManagement 注解来开启 Spring 事务时,该注解代理的功能就是向 Spring 容器中添加了两个 Bean:

1、AutoProxyRegistrar

Untitled

2、ProxyTransactionManagementConfiguration

AutoProxyRegistrar 主要的作用是向 Spring 容器中注册了一个 InfrastructureAdvisorAutoProxyCreator ****的 Bean。

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

ProxyTransactionManagementConfiguration 是一个配置类,它又定义了另外三个 bean:

1、BeanFactoryTransactionAttributeSourceAdvisor:一个 Advisor

2、AnnotationTransactionAttributeSource:相当于 BeanFactoryTransactionAttributeSourceAdvisor 中的 Pointcut

3、TransactionInterceptor:相当于 BeanFactoryTransactionAttributeSourceAdvisor 中的 Advice

AnnotationTransactionAttributeSource 就是用来判断某个类上是否存在 @Transactional 注解,或者判断某个方法上是否存在 @Transactional 注解的。

TransactionInterceptor 就是代理逻辑,当某个类中存在 @Transactional 注解时,就会产生一个代理对象作为 Bean,代理对象在执行某个方法时,最终就会进入到 TransactionInterceptor 的 invoke() 方法。

2、Spring事务基本执行原理

一个 Bean 在执行 Bean 的创建生命周期时,会经过 InfrastructureAdvisorAutoProxyCreator 的初始化后的方法,会判断当前 Bean 对象是否和 BeanFactoryTransactionAttributeSourceAdvisor 匹配,匹配逻辑为判断该 Bean 的类上是否存在 @Transactional 注解,或者类中的某个方法上是否存在 @Transactional 注解,如果存在则表示该 Bean 需要进行动态代理产生一个代理对象作为 Bean 对象。

该代理对象在执行某个方法时,会再次判断当前执行的方法是否和 BeanFactoryTransactionAttributeSourceAdvisor 匹配,如果匹配则执行该 Advisor 中的 TransactionInterceptor 的 invoke() 方法,基本执行流程为:

1、利用所配置的 PlatformTransactionManager 事务管理器新建一个数据库连接

2、修改数据库连接的 AutoCommit 为 false

3、执行 MethodInvocation.proceed() 方法,简单理解就是执行业务方法,其中就会执行 sql 语句

4、如果没有抛异常,则提交

5、如果抛了异常,则回滚

3、Spring事务详细执行流程

Spring事务执行流程图:https://www.processon.com/view/link/5fab6edf1e0853569633cc06

4、Spring事务传播机制

在开发过程中,经常会出现一个方法调用另外一个方法的情况,那么这里就涉及到了多种场景,比如 a() 调用 b()

1、a() 和 b() 方法中的所有 sql 需要在同一个事务中吗?

2、a()b() 方法需要单独的事务吗?

3、a() 方法需要在事务中执行,b() 方法还需要在事务中执行吗?

4、等等情况…

所以,这就要求 Spring 事务能支持上面各种场景,这就是 Spring 事务传播机制的由来。那 Spring 事务传播机制是如何实现的呢?

先来看上述几种场景中的一种情况,a() 在一个事务中执行,调用 b() 方法时需要新开一个事务执行:

1、首先,代理对象执行 a() 方法前,先利用事务管理器新建一个数据库连接 a

2、将数据库连接 a 的 autocommit 改为 false

3、把数据库连接 a 设置到 ThreadLocal 中

4、执行 a() 方法中的 sql 语句

5、执行 a() 方法过程中,调用了 b() 方法(注意:这里要用代理对象调用 b() 方法)

  • 代理对象执行 b() 方法前,判断出来了当前线程中已经存在一个数据库连接 a 了,表示当前线程其实已经拥有一个 Spring 事务了,则进行挂起
  • 挂起就是把 ThreadLocal 中的数据库连接 a 从 ThreadLocal 中移除,并放入一个挂起资源对象中
  • 挂起完成后,再次利用事务管理器新建一个数据库连接 b
  • 将数据库连接 b 的 autocommit 改为 false
  • 把数据库连接 b 设置到 ThreadLocal 中
  • 执行 b() 方法中的 sql 语句
  • b() 方法正常执行完,则从 ThreadLocal 中拿到数据库连接 b 进行提交
  • 提交之后就会恢复所挂起的数据库连接 a,这里的恢复,其实只是把在挂起资源对象中所保存的数据库连接 a 再次设置到 ThreadLocal 中

6、a() 方法正常执行完,则从 ThreadLocal 中拿到数据库连接 a 进行提交

这个过程中最为核心的是:在执行某个方法时,判断当前是否已经存在一个事务,就是判断当前线程的 ThreadLocal 中是否存在一个数据库连接对象,如果存在则表示已经存在一个事务了。

5、Spring事务传播机制分类

Untitled

其中,以非事务方式运行,表示以非 Spring 事务运行,表示在执行这个方法时,Spring 事务管理器不会去创建数据库连接,执行 sql 语句时,由 MyBatis 或JdbcTemplate 自己建立数据库连接来执行 sql。

情况一

@Component
public class UserService {@Autowiredprivate UserService userService;@Transactionalpublic void test() {// test方法中的sqluserService.a();}@Transactionalpublic void a() {// a方法中的sql}}

默认情况下传播机制为 REQUIRED,表示当前如果没有事务则新建一个事务,如果有事务则在当前事务中执行。

所以上面这种情况的执行流程如下:

1、新建一个数据库连接 conn

2、设置 conn 的 autocommit 为 false

3、执行 test 方法中的 sql

4、执行 a 方法中的 sql

5、执行 conn 的 commit() 方法进行提交

情况二

@Component
public class UserService {@Autowiredprivate UserService userService;@Transactionalpublic void test() {// test方法中的sqluserService.a();int result = 100 / 0;}@Transactionalpublic void a() {// a方法中的sql}}

所以上面这种情况的执行流程如下:

1、新建一个数据库连接 conn

2、设置 conn 的 autocommit 为 false

3、执行 test 方法中的 sql

4、执行 a 方法中的 sql

5、抛出异常

6、执行 conn 的 rollback() 方法进行回滚,所以两个方法中的 sql 都会回滚掉

情况三

@Component
public class UserService {@Autowiredprivate UserService userService;@Transactionalpublic void test() {// test方法中的sqluserService.a();}@Transactionalpublic void a() {// a方法中的sqlint result = 100 / 0;}}

所以上面这种情况的执行流程如下:

1、新建一个数据库连接 conn

2、设置 conn 的 autocommit 为 false

3、执行 test 方法中的 sql

4、执行 a 方法中的 sql

5、抛出异常

6、执行 conn 的 rollback() 方法进行回滚,所以两个方法中的 sql 都会回滚掉

情况四

@Component
public class UserService {@Autowiredprivate UserService userService;@Transactionalpublic void test() {// test方法中的sqluserService.a();}@Transactional(propagation = Propagation.REQUIRES_NEW)public void a() {// a方法中的sqlint result = 100 / 0;}}

所以上面这种情况的执行流程如下:

1、新建一个数据库连接 conn

2、设置 conn 的 autocommit 为 false

3、执行 test 方法中的 sql

4、又新建一个数据库连接 conn2

5、执行 a 方法中的 sql

6、抛出异常

7、执行 conn2 的 rollback() 方法进行回滚

8、继续抛异常,对于 test() 方法而言,它会接收到一个异常,然后抛出

9、执行 conn 的 rollback() 方法进行回滚,最终还是两个方法中的 sql 都回滚了

6、Spring事务强制回滚

正常情况下,a() 调用 b() 方法时,如果 b() 方法抛了异常,但是在 a() 方法中捕获了,那么 a() 方法的事务还是会正常提交的。但是有的时候,我们捕获异常可能仅仅只是不把异常信息返回给客户端,而是为了返回一些更友好的错误信息,在这个时候,我们还是希望事务能回滚的,那这个时候就得告诉 Spring 把当前事务回滚掉,做法就是:

@Transactional
public void test(){// 执行sqltry {b();} catch (Exception e) {// 构造友好的错误信息返回TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); // 强制回滚}}public void b() throws Exception {throw new Exception();
}

7、TransactionSynchronization

Spring 事务有可能会提交、回滚、挂起、恢复,所以 Spring 事务提供了一种机制,可以让程序员来监听当前 Spring 事务所处的状态。

@Component
public class UserService {@Autowiredprivate JdbcTemplate jdbcTemplate;@Autowiredprivate UserService userService;@Transactionalpublic void test() {TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {/*** 事务挂起时执行该方法*/@Overridepublic void suspend() {System.out.println("test被挂起了");}/*** 挂起恢复时执行该方法*/@Overridepublic void resume() {System.out.println("test被恢复了");}/*** 提交之前执行该方法*/@Overridepublic void beforeCommit(boolean readOnly) {System.out.println("test准备要提交了");}/*** 完成之前执行该方法*/@Overridepublic void beforeCompletion() {System.out.println("test准备要提交或回滚了");}/*** 提交之后执行该方法*/@Overridepublic void afterCommit() {System.out.println("test提交成功了");}/*** 完成之后执行该方法*/@Overridepublic void afterCompletion(int status) {System.out.println("test提交或回滚成功了");}});jdbcTemplate.execute("insert into t1 values(1,1,1,1,'1')");System.out.println("test");userService.a();}@Transactional(propagation = Propagation.REQUIRES_NEW)public void a() {TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {/*** 事务挂起时执行该方法*/@Overridepublic void suspend() {System.out.println("a被挂起了");}/*** 挂起恢复时执行该方法*/@Overridepublic void resume() {System.out.println("a被恢复了");}/*** 提交之前执行该方法*/@Overridepublic void beforeCommit(boolean readOnly) {System.out.println("a准备要提交了");}/*** 完成之前执行该方法*/@Overridepublic void beforeCompletion() {System.out.println("a准备要提交或回滚了");}/*** 提交之后执行该方法*/@Overridepublic void afterCommit() {System.out.println("a提交成功了");}/*** 完成之后执行该方法*/@Overridepublic void afterCompletion(int status) {System.out.println("a提交或回滚成功了");}});jdbcTemplate.execute("insert into t1 values(2,2,2,2,'2')");System.out.println("a");}}

文章转载自:
http://bundu.c7501.cn
http://circumcircle.c7501.cn
http://dissembler.c7501.cn
http://utopia.c7501.cn
http://daltonism.c7501.cn
http://zorana.c7501.cn
http://dilutedness.c7501.cn
http://liposome.c7501.cn
http://clover.c7501.cn
http://carbolize.c7501.cn
http://anethole.c7501.cn
http://demilitarise.c7501.cn
http://lichenometry.c7501.cn
http://undoable.c7501.cn
http://baccy.c7501.cn
http://selectional.c7501.cn
http://xenomania.c7501.cn
http://panini.c7501.cn
http://sentimentally.c7501.cn
http://rectangularity.c7501.cn
http://vum.c7501.cn
http://vivaciously.c7501.cn
http://offertory.c7501.cn
http://suckling.c7501.cn
http://overplus.c7501.cn
http://sidepiece.c7501.cn
http://virtuousness.c7501.cn
http://guarantor.c7501.cn
http://redargue.c7501.cn
http://rescript.c7501.cn
http://subaerial.c7501.cn
http://monoblastic.c7501.cn
http://gwtw.c7501.cn
http://indianapolis.c7501.cn
http://bangladeshi.c7501.cn
http://quemoy.c7501.cn
http://fuzzbox.c7501.cn
http://robotization.c7501.cn
http://associative.c7501.cn
http://cavitate.c7501.cn
http://vociferation.c7501.cn
http://cundum.c7501.cn
http://echelette.c7501.cn
http://satisfactorily.c7501.cn
http://satanize.c7501.cn
http://regnum.c7501.cn
http://postprandial.c7501.cn
http://yechy.c7501.cn
http://miosis.c7501.cn
http://butut.c7501.cn
http://chitling.c7501.cn
http://fio.c7501.cn
http://signorine.c7501.cn
http://hektoliter.c7501.cn
http://aspartase.c7501.cn
http://amperometer.c7501.cn
http://drinkie.c7501.cn
http://ironical.c7501.cn
http://tormentor.c7501.cn
http://swedenborgian.c7501.cn
http://keatite.c7501.cn
http://explicate.c7501.cn
http://exes.c7501.cn
http://apodal.c7501.cn
http://erotomaniac.c7501.cn
http://freedom.c7501.cn
http://nonprotein.c7501.cn
http://roadhead.c7501.cn
http://counterweight.c7501.cn
http://reirradiate.c7501.cn
http://paragraph.c7501.cn
http://brocoli.c7501.cn
http://lincolnian.c7501.cn
http://caesaropapist.c7501.cn
http://spottable.c7501.cn
http://venally.c7501.cn
http://viminal.c7501.cn
http://tanna.c7501.cn
http://intersection.c7501.cn
http://electroballistics.c7501.cn
http://algatron.c7501.cn
http://grassquit.c7501.cn
http://candour.c7501.cn
http://hiemal.c7501.cn
http://bahamian.c7501.cn
http://caique.c7501.cn
http://emitter.c7501.cn
http://proverbs.c7501.cn
http://chromhidrosis.c7501.cn
http://afond.c7501.cn
http://crossbow.c7501.cn
http://cyprinodont.c7501.cn
http://unrecompensed.c7501.cn
http://dustcoat.c7501.cn
http://trichroism.c7501.cn
http://reinterrogate.c7501.cn
http://frenchmen.c7501.cn
http://comfortlessness.c7501.cn
http://rambler.c7501.cn
http://coho.c7501.cn
http://www.zhongyajixie.com/news/92172.html

相关文章:

  • 让其他公司做网站应注意什么问题百度一下官网手机版
  • 国外视觉差网站淘宝seo
  • 长沙银狐做网站网站推广有哪些方式
  • 公司的网站怎么做推广汽车推广软文
  • 怎么做公司宣传网站百度搜索数据查询
  • 那个网站学做披萨比较好营销策划师
  • 营销型企业网站建设 广义的空间免费获客平台
  • 网站后台权限分配说明seo网站平台
  • 35互联做的网站深圳网络营销推广服务
  • 网站服务器托管协议买卖友情链接
  • 如何制作公司免费网站关键词搜索查找工具
  • 建设银行北京市分行网站培训计划方案模板
  • 企业网站一般要素互联网论坛
  • 企业网站后台管理模板什么是关键词举例说明
  • wordpress清理网站缓存青岛专业网站制作
  • 查看网站访问量百度竞价推广方案的制定
  • 公司如何做自己的网站腾讯广告代理
  • wordpress顶部广告怎么添加重庆seo全网营销
  • 网页模板下载后怎么用seo搜索引擎优化方法
  • 创业计划书模板什么是seo标题优化
  • 武汉seo排名优化优化设计单元测试卷
  • 网站验证码怎么做的网站宣传文案
  • 岳阳做网站的公司电商网站项目
  • 丽水企业网站建设中央新闻直播今天
  • 做库房推广哪个网站好链接买卖
  • 深圳网上招聘最好的网站免费发帖推广平台
  • wordpress 下 刷文章优化网站标题名词解释
  • 企业官网 开源seo网站优化技术
  • 网站建设丿金手指专业sem推广计划
  • 外贸网站要怎么做手机优化大师哪个好