Spring注解学习_声明式事务
接下来的几篇文章主要讲Spring声明式事务,我们先搭建学习的环境和demo。
¶环境准备
-
导入相关的依赖
数据源、数据库驱动、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>
-
配置数据源、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的方法,都只是从容器中找对应的组件。
-
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(); } }
-
测试效果:
由于我们没有开启事务,数据库中成功地插入了数据:
¶开启声明式事务
注解方式添加事务三步走:
-
给组件方法标注上@Transactional 表示当前方法是一个事务方法
-
给组件上标注@EnableTransactionManagement 开启基于注解的事务管理功能
-
向容器注册事务管理器
修改原有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/