Spring源码窥探之:声明式事务

Posted 在谷歌上百度

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring源码窥探之:声明式事务相关的知识,希望对你有一定的参考价值。

1. 导入驱动,连接池,jdbc和AOP的依赖

     <!-- c3p0数据库连接池 -->
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>

        <!-- spring提供的jdbcTemplate模块 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.12.RELEASE</version>
        </dependency>
        <!-- mysql链接驱动包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.44</version>
            <scope>runtime</scope>
        </dependency>
        <!-- AOP -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.3.12.RELEASE</version>
        </dependency>

2. 编写配置类,@EnableTransactionManagement这个注解一定要开启

/**
 * description
 *
 * @author 70KG
 * @date 2018/12/19
 */
@Configuration
@ComponentScan("com.nmys.story.springCore.springaop.tx_sample")
@EnableTransactionManagement // -- 开启基于注解的事务管理
public class TxConfig {

    // -- 配置数据源
    @Bean
    public DataSource dataSource() throws Exception {
        ComboPooledDataSource pool = new ComboPooledDataSource();
        pool.setUser("root");
        pool.setPassword("root");
        pool.setDriverClass("com.mysql.jdbc.Driver");
        pool.setJdbcUrl("jdbc:mysql://47.104.129.162:3306/usthe?useSSL=false");
        return pool;
    }

    // -- 加入模板
    @Bean
    public JdbcTemplate jdbcTemplate() throws Exception {
        JdbcTemplate template = new JdbcTemplate(dataSource());
        return template;
    }

    // -- 配置事务管理器,它才是用来提交回滚事务的主导者
    @Bean
    public DataSourceTransactionManager txManager() throws Exception {
        DataSourceTransactionManager tx = new DataSourceTransactionManager(dataSource());
        return tx;
    }

}

3. Service类和Dao类

/**
 * description
 *
 * @author 70KG
 * @date 2018/12/19
 */
@Service
public class TxService {

    @Autowired
    private TxDao txDao;

    public void insertLog(){
        txDao.insertSth();
    }

}
/**
 * description
 *
 * @author 70KG
 * @date 2018/12/19
 */
@Repository
public class TxDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    // @Transactional仅表明它是一个事务方法,开启事务仅有注解是不够的,还需要配置事务管理器
    @Transactional
    public void insertSth() {
        String sql = "INSERT into sys_log (username) VALUES(?);";
        jdbcTemplate.update(sql, "lisi");
        System.out.println("------>插入成功");
        int i = 10/0;
    }
}

4. 测试类

/**
 * description
 *
 * @author 70KG
 * @date 2018/12/19
 */
public class Test01 {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(TxConfig.class);
        TxService bean = app.getBean(TxService.class);
        bean.insertLog();
    }

}

5 结果

出异常就回滚,否则入库。

以上是关于Spring源码窥探之:声明式事务的主要内容,如果未能解决你的问题,请参考以下文章

Spring AOP源码剖析:Spring声明式事务控制

RocketMQ源码分析之从官方示例窥探:RocketMQ事务消息实现基本思想

spring 事务源码赏析

spring 声明式事务源码解析 PROPAGATION_REQUIRES

spring 声明式事务源码解析 PROPAGATION_REQUIRES

Spring源码窥探之:注解方式的AOP原理