spring 声明式事务实现过程解析
这篇文章主要介绍了spring声明式事务实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
/** *声明式事务: * *环境搭建: *1、导入相关依赖 *数数据 *3、给方法上标注@Transactional表示当前方法是一个事务方法; *4、@EnableTransactionManagement开启基于注解的事务管理功能;据源、数据库驱动、Spring-jdbc模块 **2、配置数据源、JdbcTemplate(Spring提供的简化数据库操作的工具)操作 *@EnableXXX *5、配置事务管理器来控制事务; *@Bean *publicPlatformTransactionManagertransactionManager() * * *原理: *1)、@EnableTransactionManagement *利用TransactionManagementConfigurationSelector给容器中会导入组件 *导入两个组件 *AutoProxyRegistrar *ProxyTransactionManagementConfiguration *2)、AutoProxyRegistrar: *给容器中注册一个InfrastructureAdvisorAutoProxyCreator组件; *InfrastructureAdvisorAutoProxyCreator:? *利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用; * *3)、ProxyTransactionManagementConfiguration做了什么? *1、给容器中注册事务增强器; *1)、事务增强器要用事务注解的信息,AnnotationTransactionAttributeSource解析事务注解 *2)、事务拦截器: *TransactionInterceptor;保存了事务属性信息,事务管理器; *他是一个MethodInterceptor; *在目标方法执行的时候; *执行拦截器链; *事务拦截器: *1)、先获取事务相关的属性 *2)、再获取PlatformTransactionManager,如果事先没有添加指定任何transactionmanger *最终会从容器中按照类型获取一个PlatformTransactionManager; *3)、执行目标方法 *如果异常,获取到事务管理器,利用事务管理回滚操作; *如果正常,利用事务管理器,提交事务 * */ @EnableTransactionManagement @ComponentScan("com.yuan.aop.tx") @Configuration publicclassTxConfig{ //数据源 @Bean publicDataSourcedataSource()throwsPropertyVetoException{ ComboPooledDataSourcedataSource=newComboPooledDataSource(); dataSource.setUser("root"); dataSource.setPassword("123456"); dataSource.setDriverClass("com.mysql.cj.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false"); returndataSource; } @Bean publicJdbcTemplatejdbcTemplate()throwsPropertyVetoException{ //Spring对@Configuration类会特殊处理;给容器中加组件的方法,多次调用都只是从容器中找组件 JdbcTemplatejdbcTemplate=newJdbcTemplate(dataSource()); returnjdbcTemplate; } //注册事务管理器 @Bean publicPlatformTransactionManagertransactionManager()throwsPropertyVetoException{ returnnewDataSourceTransactionManager(dataSource()); } }
@Repository publicclassUserDao{ @Autowired privateJdbcTemplatejdbcTemplate; @Transactional publicvoidinsert() { Stringsql="INSERTINTO`tbl_user`(username,age)VALUES(?,?)"; Stringusername=UUID.randomUUID().toString().substring(0,5); jdbcTemplate.update(sql,username,19); System.out.println("插入成功了"); inti=10/0; } }
@Service publicclassUserService{ @Autowired privateUserDaouserDao; publicvoidinsertUser(){ userDao.insert(); System.out.println("插入成功"); } }
publicclassApp{ publicstaticvoidmain(String[]args){ AnnotationConfigApplicationContextcontext=newAnnotationConfigApplicationContext(TxConfig.class); UserServiceservice=context.getBean(UserService.class); service.insertUser(); context.close(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。