Spring 事务源码分析-上
前言
本章节对Spring 事务源码详细解析,Spring 事务是基于Spring AOP实现,但是也离不开Spring IOC,对于Spring事务源码的学习,首先立一个明确的目标,那就是从整个Spring 源码进行解读分析。在之前文章中,我们已经有了Spring IOC源码的学习,又学了Spring AOP的源码学习,在整个过程中,我们对核心的扩展接口又有了源码深入的学习,还对Spring 事务源码IOC阶段的源码进行了深入的学习,接下来我们要把Spring事务作为第一个学完Spring源码之后的Spring源码实战应用组件去学习。
环境准备
同样准备Spring事务源码测试demo环境,业务场景非常demo,一张表table_a,三个字段,初始化数据,numm初始值为100,两个更新方法,其中一个修改为10,另一个方法加10,正常执行,最后结果为20。(场景也很简单,代码也简单,也很lower,命名也很lower,希望广大网友不要模仿,不过这么做,基本没有场景,写起来也方便,基本不用脑,费脑的事还是交给Spring源码吧。高大尚的方式应学Spring命名规范。这块为了统一测试规范,数据库中numm的值,每次测试完成之后,会手动恢复至100,下文中不在赘述)
配置类
@Configuration
@ComponentScan("com.xxsc.cn.txstudy")
@EnableTransactionManagement
@EnableAspectJAutoProxy
public class MyConfig {
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUsername("*****");
dataSource.setPassword("*****");
dataSource.setUrl("jdbc:mysql://localhost:3306/tx-study");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
//事务管理器
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
接口
public interface FunctionService {
void update(int numm,String pkId);
void add(int numm,String pkId);
}
实现类
@Service
public class FunctionServiceImpl implements FunctionService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
@Transactional
public void update(int numm, String pkId) {
String sql = "update table_a set numm=? where pk_id=?";
jdbcTemplate.update(sql,numm,pkId);
//调用另一个方法
add(numm+10,pkId);
}
@Override
public void add(int numm, String pkId) {
String sql = "update table_a set numm=? where pk_id=?";
jdbcTemplate.update(sql,numm,pkId);
}
}
测试main方法
public class AppTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
FunctionService functionService = context.getBean(FunctionService.class);
//第二个参数为sql条件
functionService.update(10,"asdfasdfasdfasdf");
}
}
数据库表table_a
先执行以下,看看数据库的变化
数据修改为20
对于以上操作及代码,交互数据使用Spring 的JdbcTemplate,这个也是比较基础,不过多解释,直接开启源码分析。
Spring事务源码解析
Spring事务源码分析入口
配置类@EnableTransactionManagement
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.