Spring jdbc事务管理之编程式事务


程序式事务:通过代码手动提交回滚事务的 事务控制方法

Spring JDBC之编程式事务的使用流程:

注意:编程式事务对Spring掌握的程度要求比较高,容易产生人为错误,优点是直接放在代码里,便于阅读

一、在配置文件中新增bean事务管理器,其中属性值为dataSource,引用JDBC数据源

 <!--事务管理器-->
<bean id="transationManage" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

添加数据源事务管理器

    private DataSourceTransactionManager transactionManager;

在要使用事务的类里包含私有属性DataSourceTransactionManager,并设置get和set方法然后进行IoC注入

在要使用事务的类的方法里开始如下流程:

首先实例化事务默认配置:

   // 定义了事务默认的标准配置
TransactionDefinition transactionDefinition = new DefaultTransactionDefinition();

通过transactionManager.getTransaction(definition)获取事务状态:

   // 开始一个事务,返回事务状态,事务状态说明当前事务的执行阶段
TransactionStatus status = transactionManager.getTransaction(transactionDefinition);

然后就是事务的正常提交与回滚

try {
    Employee employee = new Employee();
    for (int i = 1; i <= 10; i++) {
        if (i == 3) {
            throw new RuntimeException("意料之外的错误");
        }
        employee.setEname("employee" + i);
        employee.setSalary(4000);
        employee.setHiredate("2021-02-15");
        employee.setDname("市场部");
        employee.setEno(1000 + i);
        employeeDao.insert(employee);
    }
    // 执行成功,提交事务
    transactionManager.commit(status);
} catch (RuntimeException e) {
    // 执行失败,进行回滚
    transactionManager.rollback(status);
    e.printStackTrace();
    /*throw e; // 异常交由调用方处理*/

}
  • getTransaction():返回一个已经激活的事务或创建一个新的事务(根据给定的TransactionDefinition类型参数定义的事务属性),返回的是TransactionStatus对象代表了当前事务的状态,其中该方法抛出TransactionException(未检查异常)表示事务由于某种原因失败。
  • commit():用于提交TransactionStatus参数代表的事务,具体语义请参考Spring Javadoc;
  • rollback():用于回滚TransactionStatus参数代表的事务,具体语义请参考Spring Javadoc。

https://github.com/MingCaiXiong/spring-learn/commit/ddca9c255b9ab41bc23af3ba41ecba377582e784