Spring的声明式事务处理

声明式事务处理的介绍

Spring的声明式事务处理需要借助AOP的实现,本质是对方法前后拦截,然后在目标方法开始之前创建一个或者新建事务,在执行目标方法后根据执行情况提交或者回滚事务。
特点:管理事务在配置文件里配置,与业务逻辑的代码分离
实现声明式事务处理需要apalliance.jar和cglib.jar,需要PlatformTransactionManager的实现类,因为使用的是JDBC,所以实现类是DataSourceTransactionManager类,并且使用Spring提供的TransactionProxyFactoryBean类实现事务代理。

代码示例

(1)创建DAO类

在该类的create()方法使用JdbcTemplate往数据库增加一条记录

public class DAO {
      private DataSource dataSource;
      private JdbcTemplate jdbcTemplate;
      //通过依赖注入
      public void setDataSource(DataSource dataSource)
      {
          this.dataSource=dataSource;
          jdbcTemplate =new JdbcTemplate(dataSource);
      }
      //注意这里看不到事务处理的代码,一切都在配置文件中
      public void create(String msg)
      {
          jdbcTemplate.update("INSERT INTO USER VALUES('123', 'bieber')");
      }
}

(2)配置

因为在DAO中DataSource采用注入的方式实现,而且要使用TransactionProxyFactoryBean进行事务代理,所以还需要用配置文件来实现

    <!-- 设定dataSource -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName">
            <value>com.microsoft.sqlserver.jdbc.SQLServerDriver</value>
        </property>
        <property name="url">
            <value>jdbc:sqlserver://localhost:1433</value>
        </property>
        <property name="username">
            <value>sa</value>
        </property>
        <property name="password">
            <value>12345678</value>
        </property>
    </bean>

    <!-- 设定transactionManager -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource">
         <ref bean="dataSource"/>
       </property>
    </bean>

    <!-- 示例中的一个DAO -->
    <bean id="DAO" class="spring.transaction.DAO">
      <property name="dataSource">
         <ref bean="dataSource"/>
      </property>
    </bean>

    <!-- 声明式事务处理 -->
    <bean id="DAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
       <property name="transactionManager">
          <ref bean="transactionManager"/>
       </property>
       <!-- 代理的目标 -->
       <property name="target">
          <ref bean="DAO"/>
       </property>
       <!-- 如果当前没有事务,就新建一个事务 -->
       <property name="transactionAttributes">
          <props>
             <prop key="create*">PROPAGATION_REQUIRED</prop>
          </props>
       </property>
    </bean>

PROPAGATION_REQUIRED表示DAO类中的create()进行事务管理,并指明如果当前没有事务,就创建一个事务

Spring自定义的一些指定事务的属性值:

PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务
PROPAGATION_SUPPORTS:如果当前没有事务,就以非事务方式创建(就如果执行多条SQL语句,彼此没有关系,可以不都成功)
PROPAGATION_MANDATORY:如果当前没有事务,就抛出异常
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,就把当前事务挂起
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
PROPAGATION_NEVER:以非事务方式执行操作,如果当前存在事务,就抛出异常


另一种配置方式

    <!-- 声明式事务处理 -->
    <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
      <property name="transactionAttributeSource">
         <value>spring.transaction.DAO.create*=PROPAGATION_REQUIRED</value>
      </property>
    </bean>


  <bean id="DAOProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
       <property name="interceptorNames">
         <value>transactionInterceptor,DAO</value>
       </property>
    </bean>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值