Spring:编程式事务

  1. 几个概念
  2. 配置事务管理器
    1. xml配置
    2. 配置类
  3. 代码测试

几个概念

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

×

喜欢就点赞,疼爱就打赏