欢迎来到天天文库
浏览记录
ID:40568230
大小:41.00 KB
页数:6页
时间:2019-08-04
《Spring也提供了声明式事务管理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Spring也提供了声明式事务管理。这是通过SpringAOP实现的。Spring中进行事务管理的通常方式是利用AOP(面向切片编程)的方式,为普通java类封装事务控制,它是通过动态代理实现的,由于接口是延迟实例化的,spring在这段时间内通过拦截器,加载事务切片。原理就是这样,具体细节请参考jdk中有关动态代理的文档。本文主要讲解如何在spring中进行事务控制。动态代理的一个重要特征是,它是针对接口的,所以我们的dao要通过动态代理来让spring接管事务,就必须在dao前面抽象出一个接口,当然如果没有这样的接口,那么spri
2、ng会使用CGLIB来解决问题,但这不是spring推荐的方式,所以不做讨论.大多数Spring用户选择声明式事务管理。这是最少影响应用代码的选择,因而这是和非侵入性的轻量级容器的观念是一致的。从考虑EJBCMT和Spring声明式事务管理的相似以及不同之处出发是很有益的。它们的基本方法是相似的:都可以指定事务管理到单独的方法;如果需要可以在事务上下文调用setRollbackOnly()方法。不同之处如下:不象EJBCMT绑定在JTA上,Spring声明式事务管理可以在任何环境下使用。只需更改配置文件,它就可以和JDBC、JDO、H
3、ibernate或其他的事务机制一起工作Spring可以使声明式事务管理应用到普通Java对象,不仅仅是特殊的类,如EJBSpring提供声明式回滚规则:EJB没有对应的特性,我们将在下面讨论这个特性。回滚可以声明式控制,不仅仅是编程式的Spring允许你通过AOP定制事务行为。例如,如果需要,你可以在事务回滚中插入定制的行为。你也可以增加任意的通知,就象事务通知一样。使用EJBCMT,除了使用setRollbackOnly(),你没有办法能够影响容器的事务管理Spring不提供高端应用服务器提供的跨越远程调用的事务上下文传播。如果你
4、需要这些特性,我们推荐你使用EJB。然而,不要轻易使用这些特性。通常我们并不希望事务跨越远程调用回滚规则的概念是很重要的:它们使得我们可以指定哪些异常应该发起自动回滚。我们在配置文件中,而不是Java代码中,以声明的方式指定。因此,虽然我们仍然可以编程调用TransactionStatus对象的setRollbackOnly()方法来回滚当前事务,多数时候我们可以指定规则,如MyApplicationException应该导致回滚。这有显著的优点,业务对象不需要依赖事务基础设施。例如,它们通常不需要引入任何SpringAPI,事务或其
5、他任何东西。EJB的默认行为是遇到系统异常(通常是运行时异常),EJB容器自动回滚事务。EJBCMT遇到应用程序异常(除了java.rmi.RemoteException外的checked异常)时不会自动回滚事务。虽然Spring声明式事务管理沿用EJB的约定(遇到unchecked异常自动回滚事务),但是这是可以定制的。按照我们的测试,Spring声明式事务管理的性能要胜过EJBCMT。通常通过TransactionProxyFactoryBean设置Spring事务代理。我们需要一个目标对象包装在事务代理中。这个目标对象一般是一个
6、普通Java对象的bean。当我们定义TransactionProxyFactoryBean时,必须提供一个相关的PlatformTransactionManager的引用和事务属性。事务属性含有上面描述的事务定义。7、/>PROPAGATION_REQUIRED,-MyCheckedExceptionPROPAGATION_REQUIREDPROPAGATION_REQUIRED,readO8、nly事务代理会实现目标对象的接口:这里是id为petStoreTarget的bean。(使用CGLIB也可以实现具体类的代理。只要设置proxyTarg
7、/>PROPAGATION_REQUIRED,-MyCheckedExceptionPROPAGATION_REQUIREDPROPAGATION_REQUIRED,readO
8、nly事务代理会实现目标对象的接口:这里是id为petStoreTarget的bean。(使用CGLIB也可以实现具体类的代理。只要设置proxyTarg
此文档下载收益归作者所有