
Spring还提供声明式事务管理. 这是通过Spring AOP实现的.
在Spring中执行事务管理的通常方法是使用AOP(面向切片的编程)封装用于普通Java类的事务控制. 它是通过动态代理实现的. 因为延迟了接口的实例化,所以Spring会通过及时加载事务切片. 原理是这样的. 有关详细信息,请参阅jdk中有关动态代理的文档. 本文主要介绍如何在Spring中控制交易.
动态代理的一个重要特征是它是用于接口的,因此,如果我们想让spring通过动态代理接管事务,则必须在dao前面抽象一个接口. 当然,如果没有这样的接口,那么spring将使用CGLIB解决问题,但这不是spring建议的方式,因此不再讨论.
大多数Spring用户选择声明式事务管理. 这是对应用程序代码影响最小的选择,因此与无创轻量级容器的概念一致.
考虑EJB CMT与Spring声明式事务管理之间的异同是很有帮助的. 它们的基本方法相似: 它们可以将事务管理指定为单独的方法;如果需要,他们可以在事务上下文上调用setRollbackOnly()方法. 区别如下:
与EJB CMT绑定到JTA不同,Spring声明式事务管理可以在任何环境中使用. 只需更改配置文件,它将与JDBC,JDO,Hibernate或其他事务机制一起使用
Spring允许将声明式事务管理应用于普通的Java对象,而不仅仅是特殊的类,例如EJB
Spring提供了声明性的回滚规则: EJB没有相应的功能,我们将在下面讨论此功能. 回滚可以声明式控制,而不仅仅是编程方式
Spring允许您通过AOP自定义事务行为. 例如,如果需要,您可以在事务回滚中插入自定义行为. 您还可以添加任意通知,就像交易通知一样. 使用EJB CMT,除了使用setRollbackOnly()
之外,您无法影响容器的事务管理.
Spring不提供跨高端应用程序服务器提供的远程调用的事务上下文传播. 如果需要这些功能,建议您使用EJB. 但是,不要轻易使用这些功能. 通常我们不希望交易跨远程呼叫

回滚规则的概念很重要: 它们使我们可以指定哪些异常应启动自动回滚. 我们在配置文件中声明性地指定它,而不是在Java代码中指定它. 因此,尽管我们仍然可以通过编程方式调用TransactionStatus对象的setRollbackOnly()方法来回滚当前事务,但是大多数时候我们可以指定诸如MyApplicationException之类的规则来引起回滚. 这具有显着的优势,即业务对象不需要依赖事务基础结构. 例如,他们通常不需要导入任何Spring API,事务或其他任何东西.
EJB的默认行为是遇到系统异常(通常是运行时异常),并且EJB容器自动回滚事务. 当EJB CMT遇到应用程序异常(java.rmi.RemoteException以外的检查异常)时spring aop事务的含义,它不会自动回滚事务. 尽管Spring的声明式事务管理遵循EJB约定(当遇到未检查的异常时自动回滚事务)spring aop事务的含义,但是可以自定义.
根据我们的测试,Spring声明式事务管理的性能优于EJB CMT.
Spring事务代理通常是通过TransactionProxyFactoryBean设置的. 我们需要包装在交易代理中的目标对象. 目标对象通常是普通Java对象的bean. 定义TransactionProxyFactoryBean时,必须提供相关PlatformTransactionManager的引用和事务属性. 交易属性包含上述交易定义.
Java代码
> <属性> props> property> bean> > <属性> props> property> bean> 事务代理实现目标对象的接口: 这是ID为petStoreTarget的bean. (CGLIB也可以用于实现特定类的代理. 只需将proxyTargetClass属性设置为true. 如果目标对象未实现任何接口,这将自动将属性设置为true. 通常,我们希望面向接口而不是类编程. )使用proxyInterfaces属性还可以限制事务代理以代理指定的接口(通常是个好主意). 您还可以通过继承org.springframework.aop.framework.ProxyConfig或所有AOP代理工厂共享的属性来自定义TransactionProxyFactoryBean的行为. 这里的transactionAttributes属性是通过在org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource中设置属性格式来定义的. 此方法名称映射(包括通配符)非常简单. 请注意,insert *映射的值包括回滚规则. 添加的-MyCheckedException指定如果该方法抛出MyCheckedException或其子类,则事务将自动回滚. 多个回滚规则可以用逗号定义. -前缀强制回滚,而+前缀指定提交(即使抛出未检查的异常,这也允许提交事务,当然您必须了解自己在做什么). TransactionProxyFactoryBean允许您通过“ preInterceptors”和“ postInterceptors”属性设置“ pre”或“ post”通知来提供其他拦截行为. 您可以设置任意数量的“ before”和“ after”通知,它们的类型可以是Advisor(可以包括入口点),MethodInterceptor或当前Spring配置支持的通知类型(例如ThrowAdvice,AfterReturningtAdvice或BeforeAdvice). 这些是默认设置(受支持). 这些通知必须支持实例共享模式. 如果需要高级AOP功能来使用事务(例如有状态的maxin),则最好使用通用的org.springframework.aop.framework.ProxyFactoryBean而不是TransactionProxyFactoryBean实用程序代理创建器. 您还可以设置自动代理: 配置AOP框架,无需单独的代理定义类即可生成类代理. 在春季安装所有交易策略 PROPAGATION_MANDATORY PROPAGATION_NESTED PROPAGATION_NEVER PROPAGATION_NOT_SUPPORTED PROPAGATION_REQUIRED PROPAGATION_REQUIRED_NEW PROPAGATION_SUPPORTS 在B Spring中附加所有隔离策略: ISOLATION_DEFAULT ISOLATION_READ_UNCOMMITED ISOLATION_COMMITED ISOLATION_REPEATABLE_READ ISOLATION_SERIALIZABLE


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-159892-1.html
应民