Spring注解学习_声明式事务

  1. 环境准备
  2. 开启声明式事务

接下来的几篇文章主要讲Spring声明式事务,我们先搭建学习的环境和demo。

环境准备

  1. 导入相关的依赖

    数据源、数据库驱动、Spring-jdbc模块

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.2.RELEASE</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.5.2</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.15</version>
    </dependency>
    
  2. 配置数据源、JdbcTemplate( Spring提供的简化数据库操作的工具 ) 操作数据库

    package com.study.transaction;
    
    @ComponentScan("com.study.transaction")
    @Configuration
    @PropertySource("classpath:/dbconfig.properties")
    public class TxConfig {
        @Value("${db.user}")
        private String user;
        @Value("${db.password}")
        private String pwd;
        @Value("${db.driverClass}")
        private String driver;
    
        @Bean
        public DataSource dataSource() throws PropertyVetoException {
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
            dataSource.setUser(user);
            dataSource.setPassword(pwd);
            dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/tbl_user?serverTimezone=UTC");
            dataSource.setDriverClass(driver);
            return dataSource;
        }
    
        @Bean
        public JdbcTemplate jdbcTemplate() throws PropertyVetoException {
            //调用dataSource()不代表又new一个DataSource实例并返回,而是从容器中获取。
            return new JdbcTemplate(dataSource());
        }
    }
    

    注:Spring对@Configuration类会特殊处理,多次调用其中标注了@Bean的方法,都只是从容器中找对应的组件。

  3. Service & DAO & Test

    @Service
    public class UserService {
        @Autowired
        private UserDao userDao;
    
        public void insertUser(){
            userDao.insert();
            System.out.println("插入数据完成");
            int i=10/0;								//故意出个异常
        }
    }
    
    @Repository
    public class UserDao {
    
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        public void insert(){
            String sql="INSERT INTO tbl_user(username,age) VALUES (?,?);";
            String uid = UUID.randomUUID().toString().substring(0, 5);
            jdbcTemplate.update(sql,uid,19);
        }
    }
    
    public class Test_tx {
        @Test
        public void test(){
            AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(TxConfig.class);
            UserService userService = context.getBean(UserService.class);
            userService.insertUser();
            context.close();
        }
    }
    
  4. 测试效果:

    测试效果

    由于我们没有开启事务,数据库中成功地插入了数据:

    成功插入数据

开启声明式事务

注解方式添加事务三步走:

  1. 给组件方法标注上@Transactional 表示当前方法是一个事务方法

  2. 组件上标注@EnableTransactionManagement 开启基于注解的事务管理功能

  3. 向容器注册事务管理器

修改原有demo,开启事务:

配置类,注册PlatformTransactionManager(事务管理器)到Spring容器中:

@Configuration
public class TxConfig {
    //...
    
    @Bean
    public DataSource dataSource() throws PropertyVetoException {
        //...
    }

    //...

    //注册事务管理器到容器当中
    @Bean
    public PlatformTransactionManager transactionManager() throws PropertyVetoException {
        return new DataSourceTransactionManager(dataSource());
    }
    
}

事务方法所在类 要 开启基于注解的事务管理功能,标明事务方法:

@EnableTransactionManagement	//开启基于注解的事务管理功能
@Service
public class UserService {
    @Autowired
    private UserDao userDao;
    
    @Transactional	//标明事务方法
    public void insertUser(){
        userDao.insert();
        System.out.println("插入数据完成");
        int i=10/0;
    }
}

测试结果:


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,邮件至 708801794@qq.com

文章标题:Spring注解学习_声明式事务

文章字数:674

本文作者:梅罢葛

发布时间:2020-04-07, 21:02:02

最后更新:2020-04-07, 23:28:03

原始链接:https://qiurungeng.github.io/2020/04/07/Spring%E6%B3%A8%E8%A7%A3%E5%AD%A6%E4%B9%A0-%E5%A3%B0%E6%98%8E%E5%BC%8F%E4%BA%8B%E5%8A%A1/
目录
×

喜欢就点赞,疼爱就打赏