app开发者平台在数字化时代的重要性与发展趋势解析
491
2023-06-15
Spring注解 TX声明式事务实现过程解析
环境搭建导入
maven依赖
配置数据库相关信息
@Configuration
@ComponentScan("com.spring.tx")
public class TxConfig {
/**
* 配置数据源
*/
@Bean
public DataSource dataSource() throws PropertyVetoException {
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
comboPooledDataSource.setUser("root");
comboPooledDataSource.setPassword("root");
comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver");
comboPooledDataSource.setJdbcUrl("jdbc:mysql:///test");
return comboPooledDataSource;
}
@Bean
public JdbcTemplate jdbcTemplate() throws PropertyVetoException {
//Spring对配置类做了特殊处理,多次调用给容器中加组件的方法,其实是从容器中找组件,并不会重新添加
return new JdbcTemplate(dataSource());
}
}
添加数据访问层、业务层
@Repository
public class UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void saveUser(String name, Integer age) {
String sql = "insert into user(name, age) values(?, ?)";
jdbcTemplate.update(sql, name, age);
}
}
@Service
public class UserService {
@Autowired
private UserDao userDao;
public void saveUser(){
String name = "jack11";
Integer age = 19;
userDao.saveUser(name, age);
}
}
添加测试类
public class TxTest {
@Test
public void test(){
ApplicationContext context = new AnnotationConfigApplicationContext(TxConfig.class);
UserService userService = (UserService) context.getBean("userService");
userService.saveUser();
}
}
事务问题
此时基本环境已经搭建好了,点击运行,数据可以成功插入但是还没有配置事务,没有事务回滚会造成某些情况下数据出错。在Spring注解中,可以在需要添加事务的方法或类上加@Transactional,并且开启事务管理功能,即@EnableTransactionManagement,代码如下:
修改UserService 的 saveUser 方法
@Transactional
public void saveUser(){
String name = "jack11";
Integer age = 19;
userDao.saveUser(name, age);
//模拟异常
int i = 1 / 0;
}
在配置类加上@EnableTransactionManagement
@Configuration
@ComponentScan("com.spring.tx")
@EnableTransactionManagement
public class TxConfig {
//省略数据源、jdbcTemplate的配置
}
再次运行测试方法,会发现报错了,但不是我们模拟的异常报错,控制台提示找不到bean
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.transaction.PlatformTransactionManager' available
我们还需要注册一个事务管理器来管理事务,PlatformTransactionManager有很多实现类,在Spring 中 JdbcTemplate、Mybatis应该使用 DataSourceTransactionManager
在配置类中再注册一个组件,运行,事务生效
/**
* 注册事务管理器
*/
@Bean
public PlatformTransactionManager platformTransactionManager() throws PropertyVetoException {
return new DataSourceTransactionManager(dataSource());
}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~