spring基于注解方式实现事务

六、声明事务

1.基于注解方式做事务处理

环境搭建:

1).导入相关依赖

* 数据源,数据库驱动、Spring-jdbc模块
	  <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>4.3.12.RELEASE</version>
      </dependency>
      <dependency>
          <groupId>c3p0</groupId>
          <artifactId>c3p0</artifactId>
          <version>0.9.1.2</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-tx</artifactId>
          <version>4.3.12.RELEASE</version>
      </dependency>

2).配置数据源、JdbcTemplate(Spring提供简化数据源操作)操作数据源

@EnableTransactionManagement
@ComponentScan("com.it.tx")
@Configuration
public class TxConfig {


    //数据源
    @Bean
    public DataSource dataSource() throws Exception{
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser("root");
        dataSource.setPassword("");
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");

        return dataSource;
    }


    //
    @Bean
    public JdbcTemplate jdbcTemplate() throws Exception{
        //spring对@Configuration会特殊处理,给容器中加组件的方法多次调用都只是从容器中找组件
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource());
        return jdbcTemplate;
    }

    //注册事务管理器
    @Bean
    public PlatformTransactionManager platformTransactionManager() throws Exception{
        return new DataSourceTransactionManager(dataSource());
    }
}

3).给方法标注上@Transactional 表示当前方法是一个事务方法

4).@EnableTransactionManagement开启基于注解的事务管理功能:

5).配置事务管理器来控制事务

  • dao
@Repository
public class UserDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void insert(){
        String sql = "INSERT INTO `tbl_user`(username,age) VALUES(?,?);";
        String username = UUID.randomUUID().toString().substring(0, 5);
        jdbcTemplate.update(sql,username,19);
    }
}
  • service
@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    @Transactional//不加事务,数据库就不会回滚,会添加一条记录
    public void insertUser(){
        userDao.insert();
        //otherDao.other();

        System.out.println("插入完成.....");
        int i = 10/0;
    }

}
  • Test
@Test
public void test01(){

    //1.创建applicationContext
    AnnotationConfigApplicationContext applicationContext =
            new AnnotationConfigApplicationContext(TxConfig.class);


    UserService userService = applicationContext.getBean(UserService.class);
    userService.insertUser();


    applicationContext.close();
}
  • 效果
    在这里插入图片描述

在这里插入图片描述
此时的数据库中并未添加新的记录,说明 我们的事务管理开始工作了。

发布了25 篇原创文章 · 获赞 22 · 访问量 5414

猜你喜欢

转载自blog.csdn.net/weixin_42893085/article/details/104571916