我们自己定义的JDBC如何使用Spring提供的事务管理呢?
pom依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
</dependencies>
向容器注入 DataSource 数据源, PlatformTransactionManager 事务管理器
/**
* 注入一个 DataSource 资源
* @return
*/
@Bean
public DataSource dataSource() {
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUrl(url);
dataSource.setUser(username);
dataSource.setPassword(password);
return dataSource;
}
/**
* 注册 Spring 事务管理器 非常重要
*
* @param dataSource
* @return
*/
@Bean
public PlatformTransactionManager platformTransactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
Service层使用
@Transactional
public int insert() throws Exception {
/**
* 从当前事务中 获取MsSQl连接对象 {@link DataSourceUtils#getConnection}
*/
Connection connection = DataSourceUtils.getConnection(dataSource);
/**
* 预编译 Sql 执行
*/
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO `user`(username, `password`) VALUE(?, ?)");
preparedStatement.setString(1, "张三");
preparedStatement.setString(2, "123");
int i = preparedStatement.executeUpdate();
return i;
}
在开启事务的方法中(有@Transactional注解的,或者手动开启Spring事务),
使用DataSourceUtils.getConnection(dataSource)获取当前开启事务的数据库连接。核心在于DataSourceUtils.getConnection(dataSource)
Spring 事务 大致流程如下
后续有时间,死磕下Spring 事务的源码。