登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

蘭钦Happiness9090

 
 
 

日志

 
 

Spring中的事务管理  

2011-02-07 10:37:32|  分类: Spring |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

事务管理是企业级应用程序中必不可少的一项技术,用于确保数据的完整性和一致性。

作为企业级应用程序框架,Spring在不同的事务管理API上定义了一个抽象层。

程序员不必太了解底层的事务管理API,就能使用Spring事务管理机制。

 

如同EJB中的BMT(Bean-managed transaction,Bean管理事务)和CMT(Container-managed transaction,容器管理事务)方法一样,Spring即支持编程式的事务管理也支持声明式的事务管理。Spring事务支持的目标是给POJO添加事务功能,提供一种EJB事务的可选方法。

 

编程式事务管理:是将事务管理代码嵌入到业务方法中来控制事务的提交和回滚。如果方法正常完成,通常会提交事务;如果方法抛出某种类型的异常,则回滚事务。

然而在使用编程式事务管理时,必须在每个事务操作中包含另外的事务管理代码。因此要在每个操作中重复样板事务代码。此外还很难对不同的应用程序启用和禁用事务管理。事务管理是横切关注点。

 

声明式事务管理:在大多数情况下要比编程式事务管理更好用。它将事务管理代码从业务中分离出来,以声明的方式来实现事务管理。事务管理作为一种横切关注点,可以通过AOP方法模块化。Spring同Spring AOP框架支持声明式事务管理。这样可以帮助你更加轻松的为应用程序启用事务,并定义一致的事务策略。然而,声明式事务管理不太灵活,因为无法通过代码精确的控制事务。

 

事务属性:

原子性

一致性

隔离性

持久性

 

1.选择事务管理器实现

问题:一般情况下,如果应用程序只涉及单个数据源,可以只在数据库连接上调用commit()和rollback()方法来管理事务。

然而,如果事务扩展到多个数据源,或者你更喜欢使用JavaEE应用服务器提供的事务管理功能,就可以选择JTA(Java Transaction API,Java事务API)。此外,你可能还需要为不同的对象/关系映射框架(如:Hibernate或JPA)调用不同专用事务API。

因此,必须为不同的技术处理不同的事务API。很难从一组API切换到另一组API。

 

实现方案:PlateformTransactionManager是所有Spring事务管理器的通用接口。Spring内置了几个实现,用于不同事物管理API。

Spring中的事务管理 - lrf8933 - 罗若峰

 如果在应用程序中只需要处理一个数据源,并且通过JDBC进行存取,DataSourceTransactionManager应该满足需求。

如果在JavaEE应用服务器上涌JTA进行事务管理,就应该使用JtaTransactionManager从应该服务器查找事务。

如果使用ORM存取数据库,并且通过JDBC进行存取,就应该选取相应的事务管理器。

 

事务管理器以普通Bean的形式声明在SpringIoC容器里。例如,下面的Bean配置声明了一个DataSourceTransactionManager实例。

它需要设置dataSource属性,以便可以对这个数据源上的连接进行事务管理。

Spring中的事务管理 - lrf8933 - 罗若峰

 

2.用事务管理器API编程式地管理事务

Spring中的事务管理 - lrf8933 - 罗若峰
Spring中的事务管理 - lrf8933 - 罗若峰
 
 
Spring中的事务管理 - lrf8933 - 罗若峰
 
Spring IoC容器:
Spring中的事务管理 - lrf8933 - 罗若峰
  

3.用事务模板编程式地管理事务

Spring中的事务管理 - lrf8933 - 罗若峰

 Spring中的事务管理 - lrf8933 - 罗若峰

Spring中的事务管理 - lrf8933 - 罗若峰
Spring中的事务管理 - lrf8933 - 罗若峰

 

Spring中的事务管理 - lrf8933 - 罗若峰
Spring中的事务管理 - lrf8933 - 罗若峰

 

Spring中的事务管理 - lrf8933 - 罗若峰
Spring中的事务管理 - lrf8933 - 罗若峰
Spring中的事务管理 - lrf8933 - 罗若峰

 

4.用经典的Spring AOP声明式地管理事务

 问题:事务管理是一种横切关注点,AOP是实现它的理想方法。然而,如果要在Spring1.x中声明式地管理事务,就必须使用经典Spring AOP方法。

 

解决方案:Spring为事务管理提供了一个环绕通知,称作TransactionInterceptor。这个通知像事务模板一样控制这事务管理流程,但它使用于整个方法体,而不是任意的代码块。默认情况下,在方法开始之前,这个通知就启动了一个新的事务。如果方法抛出未受检的异常,上午就被回滚。否则完成方法之后就提交事务。

在经典Spring AOP中,必须利用ProxyFactoryBean为Bean创建一个代理来应用TransactionInterceptor通知。由于事务管理在企业应用中非常普遍,因此Spring提供了一个TransactionProxyFactoryBean类,它专用于创建事务代理。

 Dao类:

Spring中的事务管理 - lrf8933 - 罗若峰

 Spring IoC容器:

Spring中的事务管理 - lrf8933 - 罗若峰
Spring中的事务管理 - lrf8933 - 罗若峰

 Main类:

Spring中的事务管理 - lrf8933 - 罗若峰

 

Spring中的事务管理 - lrf8933 - 罗若峰

 

 

5.用事务通知声明式的管理事务

Spring中的事务管理 - lrf8933 - 罗若峰
Spring中的事务管理 - lrf8933 - 罗若峰
Spring中的事务管理 - lrf8933 - 罗若峰
Spring中的事务管理 - lrf8933 - 罗若峰
Spring中的事务管理 - lrf8933 - 罗若峰

 Main类:

Spring中的事务管理 - lrf8933 - 罗若峰

 

6.用@Transactional注解声明式地管理事务

Spring中的事务管理 - lrf8933 - 罗若峰
Spring中的事务管理 - lrf8933 - 罗若峰

 Spring IoC容器:

Spring中的事务管理 - lrf8933 - 罗若峰

 

Spring中的事务管理 - lrf8933 - 罗若峰

 

7.设置传播事务属性

问题描述:当事务方法别另一个方法调用时,必须制定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能启动一个新事务,并在它自己的事务中运行。

 

解决方法:事务的传播行为可以由传播事务属性制定。Spring定义了7种传播行为,这些行为时在org.springframework.transaction.TransactionDefinition中定义的。并非所有事务管理器类型都支持这些传播行为。

Spring中的事务管理 - lrf8933 - 罗若峰

 

 

8.

 

9.

 

10.

 

11.

 

12.

 

13.

 

14

 

15.

 

16.

  评论这张
 
阅读(3645)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018