60.Spring事务实现基本原理
使用注解
@EnableTransactionManagement
原理
- 1.解析切面 ——> bean的创建前第一个bean的后置处理器进行解析advisor(pointcut(通过@Transacational解析的切点) , advise) (这个advisor 是通过@EnableTransactionManagement注册了一个配置类,该配置类就配置了adivsor)
- 2.创建动态代理——> bean的初始化后调用bean的后置处理器进行创建动态代理(有接口使用jdk,没接口使用cglib), 创建动态代理之前会先根据advisor中pointCut 匹配@Transacational( 方法里面是不是有、类上面是不是有、接口或父类上面是不是有 ) , 匹配到就创建动态代理。
- 3.调用: 动态代理
- 4.创建一个数据库连接Connection, 并且修改数据库连接的autoCommit属性为false,禁止此连接的自动提交,这是实现Spring事务非常重要的一步
- 5.然后执行目标方法方法,方法中会执行数据库操作sql
- 6.如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务
- 7.执行完当前方法后,如果没有出现异常就直接提交事务
扩展小课堂
Spring事务实现基本原理
Spring本身并不实现事务,Spring事务的本质还是底层数据库对事务的支持,没有数据库 事务的支持,Spring事务就不会生效。
例如:使用JDBC 操作数据库,使用事务的步骤主要分为如下5步:
- 获取连接 Connection con = DriverManager.getConnection();
- 开启事务con.setAutoCommit(true/false);
- 执行CRUD;
- 提交事务/回滚事务 con.commit() / con.rollback();
- 关闭连接 conn.close();
采用Spring事务后,只需要 关注第三步的实现,其他的步骤都是Spring自动完成。
Spring事务的本质其实就是数据库对事务的支持,Spring只提供统一事务管理接口,具体实现都是由各数据库自己实现。
Spring事务使用
Spring事务管理有两种方式:编程式事务管理、声明式事务管理。
-
编程式事务
所谓编程式事务指的是通过编码方式实现事务,允许用户在代码中精确定义事务的边界。
Spring团队通常建议使用TransactionTemplate进行程序化事务管理,如下所示: -
声明式事务
声明式事务最大的优点:就是不需要通过编程的方式管理事务,只需在需要使用的地方标注@Transactional注解,就能为该方法开启事务了。如下所示
文章来源:https://www.toymoban.com/news/detail-806787.html
Spring事务实现原理
想要了解Spring事务的实现原理,一个绕不开的点就是Spring AOP,因为事务就是依靠Spring AOP实现的。
@EnableTransactionManagement是开启注解式事务的事务,如果注解式事务真的有玄机,那么@EnableTransactionManagement就是我们揭开秘密的突破口。
@EnableTransactionManagement注解源码如下:
@EnableTransactionManagement注解,主要通过@Import引入了另一个配置TransactionManagentConfigurationSelector。
在 Spring中Selector通常都是用来选择一些Bean,向容器注册:AutoProxyRegistrar、ProxyTransactionManagementConfiguration两个Bean。
ProxyTransactionManagementConfiguration是一个配置类,实现类主要是TransactionInterceptor,这里会涉及Spring AOP实现切面逻辑织入。文章来源地址https://www.toymoban.com/news/detail-806787.html
到了这里,关于60.Spring事务实现基本原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!