Spring注解 TX声明式事务实现过程解析

网友投稿 491 2023-06-15

Spring注解 TX声明式事务实现过程解析

Spring注解 TX声明式事务实现过程解析

环境搭建导入

maven依赖

org.springframework

spring-jdbc

5.0.2.RELEASE

com.mchange

c3p0

0.9.5.5

mysql

mysql-connector-java

5.1.48

配置数据库相关信息

@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小时内删除侵权内容。

上一篇:StringUtils里的isEmpty方法和isBlank方法的区别详解
下一篇:SpringMVC中RequestContextHolder获取请求信息的方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~