Java EE框架整合开发入门到实战:Spring+Spring MVC+MyBatis(微课版)
上QQ阅读APP看书,第一时间看更新

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节中的测试类一样,这里不再赘述。