Spring(五)基于XML的事务配置

Spring中事务控制的 API介绍

PlatformTransactionManager

public interface PlatformTransactionManager {
 // 获取事务的状态信息
   TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;
// 提交事务
   void commit(TransactionStatus var1) throws TransactionException;
// 回滚事务
   void rollback(TransactionStatus var1) throws TransactionException;
}

其实现类:

org.springframework.jdbc.datasource.DataSourceTransactionManager

使用 Spring JDBC 或 iBatis 进行持久化数据时使用

org.springframework.orm.hibernate5.HibernateTransactionManager

使用 Hibernate 版本进行持久化数据时使用

TransactionDefinition
public interface TransactionDefinition {
 // 获取事务传播行为
   int getPropagationBehavior();
 // 获取事务隔离级别
   int getIsolationLevel();
// 获取事务超时时间
   int getTimeout();
 // 获取事务是否只读
   boolean isReadOnly();
 // 获取事务对象名称
   String getName();
}
事务的隔离级别
int ISOLATION_DEFAULT ; // 默认级别
int ISOLATION_READ_UNCOMMITTED; // 可以读取未提交的数据
int ISOLATION_READ_COMMITTED ; // 只能读取已提交的数据 解决脏读问题(Oracle默认级别)
int ISOLATION_REPEATABLE_READ ; // 是否读取事务提交修改后的数据 解决不可重复读的问题(MySQL的默认级别)
int ISOLATION_SERIALIZABLE ; // 是否读取其他事务提交添加后的数据,解决幻读问题
事务的传播行为

REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)

SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)

MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常

REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。

NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起

NEVER:以非事务方式运行,如果当前存在事务,抛出异常

NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行

REQUIRED 类似的操作。

超时时间

默认值是-1,没有超时限制。如果有,以秒为单位进行设置

TransactionStatus

public interface TransactionStatus extends SavepointManager, Flushable {
// 获取事务是否是新的事务
   boolean isNewTransaction();
// 获取事务是否存在存储点
   boolean hasSavepoint();
// 设置事务回滚
   void setRollbackOnly();
// 获取事务是否回滚
   boolean isRollbackOnly();
// 刷新事务
   void flush();
// 获取事务是否完成
   boolean isCompleted();
}

基于 XML 的声明式事务控制(配置方式)

<!--pom.xml-->
<dependencies>
   <dependency>
       <groupId>org.aspectj</groupId>
       <artifactId>aspectjweaver</artifactId>
       <version>1.8.7</version>
   </dependency>
   <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.6</version>
   </dependency>
   <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.12</version>
   </dependency>
   <!--spring-->
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-context</artifactId>
       <version>5.0.4.RELEASE</version>
   </dependency>
   <dependency>
       <groupId>commons-dbcp</groupId>
       <artifactId>commons-dbcp</artifactId>
       <version>1.4</version>
   </dependency>
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-test</artifactId>
       <version>5.0.8.RELEASE</version>
   </dependency>
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-tx</artifactId>
       <version>5.0.8.RELEASE</version>
   </dependency>
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-jdbc</artifactId>
       <version>5.0.2.RELEASE</version>
   </dependency>
</dependencies>
<!--bean.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xmlns:tx="http://www.springframework.org/schema/tx"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop.xsd">

   <!--配置service set注入-->
   <bean id="accountService" class="fun.chenqi.service.impl.AccountServiceImpl">
       <property name="dao" ref="accountDao"/>
   </bean>

   <!--配置dao-->
   <bean id="accountDao" class="fun.chenqi.dao.impl.AccountDaoImpl">
       <property name="jdbcTemplate" ref="jdbcTemplate"/>
   </bean>
   <!--配置jdbctemplate-->
   <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
       <property name="dataSource" ref="dataSource"/>
   </bean>
   <!--配置dbcp数据源-->
   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
       <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
       <property name="url" value="jdbc:mysql://localhost:3306/chenqi"/>
       <property name="username" value="root"/>
       <property name="password" value="111"/>
   </bean>

   <!-- 第一步:配置事务管理器 -->
   <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <!--注入 DataSource -->
       <property name="dataSource" ref="dataSource"/>
   </bean>

   <!--第二步:配置事务的通知引用事务管理器 相当于要增强的类是谁-->
   <tx:advice id="txAdvice" transaction-manager="transactionManager">
       <!--第三步:配置事务的属性 -->
       <!--
       指定方法名称:是业务核心方法
       read-only:是否是只读事务。默认 false,不只读。
       isolation:指定事务的隔离级别。默认值是使用数据库的默认隔离级别。
       propagation:指定事务的传播行为。
       timeout:指定超时时间。默认值为:-1。永不超时。
       rollback-for:用于指定一个异常,当执行产生该异常时,事务回滚。
       产生其他异常,事务不回滚。 没有默认值,任何异常都回滚。
       no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,
       产生其他异常时,事务回滚。没有默认值,任何异常都回滚。
       -->
       <tx:attributes>
           <tx:method name="*" read-only="false" propagation="REQUIRED"/>
           <tx:method name="find*" read-only="true" propagation="SUPPORTS"/>
       </tx:attributes>
   </tx:advice>

   <!--第四步:配置 AOP 切入点表达式 -->
   <!--配置AOP-->
   <aop:config>
       <!--配置切入点表达式-->
       <aop:pointcut id="po" expression="execution(* fun.chenqi.service.impl.*.*(..))"/>
       <!-- 第五步:配置切入点表达式和事务通知的对应关系 -->
       <aop:advisor advice-ref="txAdvice" pointcut-ref="po"/>
   </aop:config>

</beans>

其他代码不变

发表评论