黄晓童SPRING学习笔记:Spring的事务管理

本文详细介绍了Spring框架中的事务管理机制,包括Spring如何通过不同的事务管理器实现事务控制、TransactionTemplate的使用方法、以及三种声明式事务管理方式:基于AOP代理bean、基于XML声明和注释驱动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring的定义
对DI的初步理解
对AOP的初步理解
对DI的深入探究
对AOP的深入探究
Spring的事务管理
Spring MVC

首先来说一些概念性的东西,就是事务的的ACID属性:
原子性:事务中的操作要么都发生要么都不发生;
一致性:事物一旦结束了,数据不应当被破坏;
隔离性:一个用户的操作不能和其他用户的操作相混淆;
持久性:一旦事务完成,应当被持久化。

 spring是不直接管理事务的,而是交给事务管理器。所有的spring事务管理器都是实现自PlatformTransactionManager接口的,比如,hibernate的事务管理器为HibernateTransactionManager类、JDBC或iBatis的事务管理器是DataSourceTransactionManager类等等。这里就不一一列举了,用到的话可以去查资料。下面给出了JDBC事务管理器的配置的例子:

<bean id=”transactionManager” class=”org.springframework.jdbc.datasource. DataSourceTransactionManager”>
 <property  name=”dataSource”  ref=”yourDataSourceBean” />
</bean>

 

 下面我们就尝试用spring的TransactionTemplate方式编写一个事务,TransactionTemplate是通过一种叫做回叫机制的实现的。

public  void  youMethodName()        //要加入事务管理的方法的名字
{
 transactionTemplate.execute
 (
  new  TransactionCallback()
  {
   public  Object  doInTransaction( TransactionStatus  ts )
   {
    try
    {
     ………            //这里写原来的业务逻辑代码
    }
    catch( Exception e )
    {
     ts.setRollbackOnly();
    }
    
    return  null;
   }
  }
 )
}

 

 当然,在这个类的youMethodName方法中使用的transactionTemplate是需要被注入进来的。像如下这样:(其中飘红的依赖可以是上面说到的任何一种spring事务管理器。)

<bean id=”youClass” class=”com.alibaba.YouClass”>
 <property  name=” transactionTemplate”>
  <bean  class=”org.springframework.Transaction.support. TransactionTemplate”>
   < property  name=” transactionManager”  ref=” transactionManager”  />
  </bean>
 </ property>
</bean>

 

 下面来说一下spring的声明式事务。spring的声明式事务共有三种:一种是基于aop代理bean的方式;一种是基于简单的xml声明的tx命名空间的方式;最后一种是注释驱动事务。先来说一下spring定义事务的几个参数:传播行为、隔离级别、只读、事务超时、回滚规则。下面定义的是第一种声明式事务(基于aop代理bean的方式):

<bean id=”someService” class=” org.springframework.Transaction.interceptor.TransactionProxyFactoryBean”>
<property  name=”target”  ref=”someServiceTarget”  />
<property  name=”proxyInterfaces”  ref=”com.alibaba.service.SomeService”  />
<property  name=” transactionManager”  ref=” transactionManager”  />
<property  name=” transactionAttributes”>
 <props>
  <prop  key=”add*”>…</props>
  <prop  key=”*”>…</props>
 </props>
</property>
</bean>

 

 上面的transactionManager可以是前面提到的任何一种spring事务管理器。而transactionAttributes属性则是指明了事务的具体参数。它含有一个props集,该集含有N个prop属性,每个<prop>的键是一个方法名称的模式,而其具体指则是事务的具体参数。其中事务的具体参数的顺序为:传播行为(必选)、隔离级别(可选)、是否只读(可选)、回滚规则(可选),他们之间以逗号隔开。

下面的则是以tx命名空间声明的事务:

<tx:advice  id=”txAdvice”  transaction-manager=” transactionManager”>
<tx:attributes>
<tx:method  name=”add*”  ……>
<tx:method  name=”*”  ……>
</tx:attributes>
</tx:advice>

 

 其中“transaction-manager”指明了spring的事务管理器,<tx:attributes>则类似前面提到的<props>。省略号部分的属性名包括:isolation(事务隔离级别)、no-rollback-for(哪些异常事务是不需要回滚的)、propagation(事务的传播规则)、read-only(是否只读)、rollback-for(哪些异常应该回滚事务)、timeout(超时时间)。当然,这只是事务通知,我们还没有定义哪些bean应该被通知。

<aop:config>
 <aop:advistor  pointcut=””  advice-ref=” txAdvice”  />
</aop:advistor>

 

 最后一种实现spring事务的方式是注释驱动的方式。在类或接口中都可以使用。只需要加上@Transactional(......)即可,括号里加上具体的事务参数。当然,配置文件中要加上如下代码:

<tx:annotation-driven  transaction-manager=”txManager”>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值