Spring 注解版 学习笔记声明式事务
Posted Adorable_Rocy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 注解版 学习笔记声明式事务相关的知识,希望对你有一定的参考价值。
前言:为什么要有事务?为什么要使用事务?下面小编举个例子说明一下吧~
- 假设我需要去银行存100块钱,使用ATM自动存款机,在完成准备工作后,将100块钱放到ATM机中,等待完成存款,可是在存款的过程中,ATM机器出现了问题,自动将100块钱退还了出来,但是尽管这次存款失败,在账户上仍然存上了100块钱,这样的过程当然是十分不可取的,在操作数据库中,声明式事务的出现,接管了这种糟糕的事情处理结果,让操作变得更加安全可靠。
1. @Transactional注解:声明事务(标注到方法上)
- UserDao
@Repository
public class UserDao {
@Autowired
JdbcTemplate jdbcTemplate;
public void insert(){
String sql = "INSERT INTO db_user (username, age ) VALUES (?,?)";
String username = UUID.randomUUID().toString().substring(0, 6);
jdbcTemplate.update(sql,username,20);
}
}
- Service
@Resource
UserDao userDao;
/** 开启事务 */
@Transactional
public void insert(){
userDao.insert();
log.info("插入方法结束");
}
2.@EnableTransactionManagement注解:配置文件开启启动事务管理器
配置类:
@Configuration
@ComponentScan("fatcats.top.demo")
@EnableTransactionManagement
public class TxConfig {
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUsername("root");
dataSource.setPassword("root");
dataSource.setUrl("jdbc:mysql://localhost:3306/db_info?useSSL=false&serverTimezone=Asia/Shanghai");
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate() throws Exception{
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource());
return jdbcTemplate;
}
}
3.PlatformTransactionManager组件需要添加到容器中(至关重要)
@Configuration
@ComponentScan("fatcats.top.demo")
@EnableTransactionManagement
public class TxConfig {
@Bean
public PlatformTransactionManager transactionManager(){
return new DataSourceTransactionManager(dataSource());
}
}
4.测试
插入完成
拓展:手动制造异常,查看事务处理方式
@Transactional
public void insert(){
userDao.insert();
log.info("插入方法结束");
try {
int i = 10 / 0;
}catch (Exception e){
throw new RuntimeException("手动抛出异常~");
}
}
测试:
可想而知,已经发生了回滚,数据库肯定是没有添加数据的
补充:再次插入一条正常流程数据
这里发现他的自增长ID变成了3,说明数据虽然没有被插入进去,但是id其实已经自增1了
以上是关于Spring 注解版 学习笔记声明式事务的主要内容,如果未能解决你的问题,请参考以下文章
Spring5学习笔记(14) — “Spring5 声明式事务管理”
Spring5学习笔记(14) — “Spring5 声明式事务管理”