
5.2 编程式事务管理
在代码中显式调用beginTransaction、commit、rollback等与事务处理相关的方法,这就是编程式事务管理。当只有少数事务操作时,编程式事务管理才比较合适。
5.2.1 基于底层API的编程式事务管理
基于底层API的编程式事务管理就是根据PlatformTransactionManager、TransactionDefinition和TransactionStatus几个核心接口,通过编程的方式来进行事务处理。下面通过一个实例讲解基于底层API的编程式事务管理,具体步骤如下:
① 给数据源配置事务管理器
在5.1.2节配置文件applicationContext.xml的基础上使用PlatformTransactionManager接口的实现类org.springframework.jdbc.datasource.DataSourceTransactionManager为数据源添加事务管理器,具体代码如下:

② 创建数据访问类
在com.ch5包中创建数据访问类CodeTransaction,并注解为@Repository("codeTransaction")。在该类中使用编程的方式进行数据库事务管理。
CodeTransaction类的代码如下:

③ 创建测试类
在com.ch5包中创建测试类TestCodeTransaction,具体代码如下:

上述测试类的运行结果如图5.4所示。

图5.4 基于底层API的编程式事务管理测试结果
从图5.4所示的结果可以看出取消了主键重复前执行的删除和插入操作。
5.2.2 基于TransactionTemplate的编程式事务管理
事务处理的代码散落在业务逻辑代码中,破坏了原有代码的条理性,并且每一个业务方法都包含了类似的启动事务、提交以及回滚事务的样板代码。
TransactionTemplate的execute方法有一个TransactionCallback接口类型的参数,该接口中定义了一个doInTransaction方法,通常以匿名内部类的方式实现TransactionCallback接口,并在其doInTransaction方法中书写业务逻辑代码。在这里可以使用默认的事务提交和回滚规则,在业务代码中不需要显式调用任何事务处理的API。doInTransaction方法有一个TransactionStatus类型的参数,可以在方法的任何位置调用该参数的setRollbackOnly方法将事务标识为回滚,以执行事务回滚。
根据默认规则,如果在执行回调方法的过程中抛出了未检查异常,或者显式调用了setRollbackOnly方法,则回滚事务;如果事务执行完成或者抛出了checked类型的异常,则提交事务。
基于TransactionTemplate的编程式事务管理的步骤如下:
① 为事务管理器添加事务模板
在5.2.1节配置文件applicationContext.xml的基础上使用org.springframework. transaction.support.TransactionTemplate类为事务管理器添加事务模板,具体代码如下:

② 创建数据访问类
在com.ch5包中创建数据访问类TransactionTemplateDao,并注解为@Repository("transactionTemplateDao")。在该类中使用编程的方式进行数据库事务管理。
数据访问类TransactionTemplateDao的代码如下:

③ 创建测试类
在com.ch5包中创建测试类TransactionTemplateTest,该类的代码及运行结果与5.2.1节中的测试类一样,这里不再赘述。