Spring 事务管理

事务管理

    1.事务 (见hibernate的ACID): Spring和EJB一样,不仅提供对程序控制事务管理的支持(手动事务),也对提供声明式事务管理的支持(容器管理事务),但是Spring对程序控制事务管理的支持与EJB很不一样。EJB的事务管理和Java Transaction API(JPA)密不可分。和Ejb不同的是Spring采用的是一种回调机制,把真实的事务从事务代码中抽象出来,那么Spring就不需要JPA的实现。选择手动事务还是容器管理,就是在细微控制和简便操作之间做出选择。想精确控制事务就可以选择手动事务,不用那么精确就可以容器管理事务。

 

2.事务管理器:不管你是在bean中代码编写事务还是用切面(aspect aop)那样声明事务,都需要Spring的事务管理器连接特定平台的事务实现,每一种访问形式都有一个事务管理器。比如:

    

jdbc.datasource.DataSourceTransactionManager:jdbc连接的事务管理,iBATIS也支持

orm.hibernate3. HibernateTransactionManager  :hibernate3的事务支持

orm.jpa.JpaTransactionManager :jpa的事务支持

orm.jdo.JdoTransactionManager   :Jdo事务管理支持

 

这些事务管理器分别充当了某个特定的事务实现门面,这样你就只要和Spring的事务打交道,而不用关心实际上的事务是怎么实现的(门面模式)

 

各种事务管理器的配置,以Hibernate 3为例:

 

3.JDBC事务管理

  ---à DataSourceTransactionManager调用Connection来管理事务

 

 

4,在spring中手动编写事务

    利用事务模板TransactionTemplate来手动添加事务

 

public void addRant(Rant rant) {

transactionTemplate.execute(-àtransactionTemplate是注入transactionManager得到的

new TransactionCallback() {-à TransactionCallback()只有一个方法实现doInTransaction,用一个匿名内部类实现

public Object doInTransaction(TransactionStatus ts) {  ------à在事务内执行

try {

rantDao.saveRant(rant);

} catch (Exception e) {

ts.setRollbackOnly();------------------à出现异常就回滚

}return null;

}

}

配置文件

class="com.roadrantz.service.RantServiceImpl">

ref="transactionManager" />

 

 

5,声明式事务

   可以把事务想成一个切面,那么就可以用事务性边界包裹Biz层的方法,然后注入事务

   Spring提供了三种在配置文件声明事务性边界的方式:★常用的Spring aop代理 bean来支持事务。★但在Spring 2中增加了两种新的方式:简单的XML声明(xml-declared)事务和★注释驱动事务

 

   1)代理事务:声明式事务管理通过使用Spring的TransactionProxyFactoryBean代理POJO来完成。TransactionProxyFactoryBean是ProxyFactoryBean的一个特化,他知道如何通过事务性边界包裹一个POJO的方法来代理他们。

 

      --à装配事务目标,相当给biz层的方法加事务

   --à提供适当的事务管理器

PROPAGATION_REQUIRED

PROPAGATION_SUPPORTS,readOnly

6.事务传播行为:

 PROPAGATION_REQUIRED :当前方法必须有一个事务,有事务则运行该事务,没有则开始新的事务。---à最常用

 PROPAGATION_MANDATORY:该方法必须有事务,没有事务则抛出异常

PROPAGATION_NESTED :该方法运行在嵌套事务中。如果封装事务不存在则就像第一种PROPAGATION_REQUIRED

PROPAGATION_NEVER  :该方法不能有事务,有事务则抛出异常。

PROPAGATION_NOT_SUPPORTED:该方法不能有事务,如果有事务,则将该方法在运行期间挂起。

PROPAGATION_REQUIRES_NEW:方法必须运行在事务里,

PROPAGATION_SUPPORTS:表示当前方法不需要事务性上下文,但是如果有一个事务已经在运行的话,他可以在这个事务里运行。

 

PROPAGATION,   ISOLATION,     readOnly,     -Exception, +Exception

     (传播行为)    (隔离级别 可选)  (事务只读 可选)  (回滚规则  可选)

 

  可以创建事务模板简化配置  :建立事务的抽象声明

 

 abstract=“true”>

   --à提供适当的事务管理器

PROPAGATION_REQUIRED

PROPAGATION_SUPPORTS,readOnly

  

   --à提供适当的事务管理器

 

2)在Spring2.0声明事务 上面的方法会导致配置很臃肿,下面就是更简单的配置

   在Spring2.0中专门为声明事务提供了一些新的标签 tx名称空间下

xmlns:tx=http://www.springframework.org/schema/tx

xmlns:aop="http://www.springframework.org/schema/aop"

     http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

        

        

 

3)定义注释驱动的事务,@Transactional可以在源代码中注释来进一步简化配置

@Transactional(propagation=Propagation.SUPPORTS, readOnly=true)

@Service("roster")

public class RosterImpl implements Rosterpublic

@Transactional                  ---------------  --------à方法层面的事务

Public  Player createPlayer(Player p) {

         playerDao.save(p);

         return p;

}

 

base-package="com.kettas.spring.dao.day5.roster.dao,com.kettas.spring.dao.day5.roster.biz">

  自动搜索@Transactional的bean 然后把事务通知告诉它。

 

你可能感兴趣的:(Spring 事务管理)