几个概念
PlatformTransactionManager
:事务管理器,
DataSourceTransactionManager
:使用jdbc来存取数据,只有一个数据源JtaTransactionManager
:在JavaEE的应用服 务器上使用HibernateTransactionManager
:和Hibernate框 架进行整合时使用
TransactionDefinition
:事务定义对象,定义了事务的规则,并提供获取事务相关信息的方法。隔离级别,传播性,是否只读,timeout时间等。
TransactionStatus
:事务的状态,描述了某个时间点上事务的状态。
配置事务管理器
xml配置
<!-- 导入外部属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!--引入外部属性文件,创建数据源对象-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${jdbc.url}"></property>
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="username" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 配置 JdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 装配数据源 -->
<property name="dataSource" ref="druidDataSource"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="druidDataSource"></property>
</bean>
配置类
@Configuration
@PropertySource("classpath:jdbc.properties")
public class AppConfig {
@Value("${jdbc.url}")
private String jdbcUrl;
@Value("${jdbc.driver}")
private String jdbcDriver;
@Value("${jdbc.user}")
private String jdbcUser;
@Value("${jdbc.password}")
private String jdbcPassword;
// 配置数据源
@Bean
public DataSource druidDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(jdbcUrl);
dataSource.setDriverClassName(jdbcDriver);
dataSource.setUsername(jdbcUser);
dataSource.setPassword(jdbcPassword);
return dataSource;
}
// 配置 JdbcTemplate
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
/**
* 配置事务管理器
* @param dataSource 就是上面配置的数据源
* @return
*/
@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource){
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}
代码测试
@SpringJUnitConfig(classes = AppConfig.class)
public class Test {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private DataSourceTransactionManager transactionManager;
@org.junit.jupiter.api.Test
void test1(){
String sql = "INSERT INTO t_emp VALUES(NULL,?,?,?)";
// 事务定义对象,定义了事务的规则,并提供获取事务相关信息的方法。隔离级别,传播性,是否只读,timeout时间等。
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
// 开启事务
TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition);
try {
jdbcTemplate.update(sql, "赵敏", 20, "女");
// 模拟出错
int i = 1 / 0;
jdbcTemplate.update(sql, "周芷若", 20, "女");
// 提交事务
transactionManager.commit(transactionStatus);
}catch (Exception e){
// 回滚事务
transactionManager.rollback(transactionStatus);
System.out.println(e.getMessage());
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1909773034@qq.com