当前位置: 首页 > 网络应用技术

[翻译]春季框架的交易管理

时间:2023-03-05 20:08:14 网络应用技术

  原始链接是本文官方文档的主要翻译,还可以在作者的明显位置添加说明,示例,链接等。

  综合交易支持是使用春季框架的最令人信服的原因之一。Spring框架为管理事务提供了一致性抽象。它具有以下优势:

  以下部分描述了春季框架的价值和技术。本章还讨论了最佳实践,应用程序服务器集成和常见问题的解决方案。)

  传统上,Java EE开发人员有两个用于交易管理的选择:全球或本地事务,两者都有很大的局限性。在以下两个部分,审查全球和地方事务管理,然后讨论春季框架交易管理的限制。解决全球和地方事务模型的局限性。

  全球事务是您可以使用许多来源,通常是关系数据库和消息队列。应用程序管理通过JTA.这是一个非常麻烦的API(部分是由于其异常模型)。在此外,JTA UserTransaction通常需要是源自JNDI(Java命名和目录界面,Java命名和目录界面),这意味着您还需要使用JNDI来使用JTA。易于使用,全球事务的使用将限制某些潜在的应用程序代码,因为JTA通常是JTA,因为通常是JTA仅在应用程序服务器环境中可用(即在此服务中,它无法控制多个服务(例如SEATA)。

  以前,使用全球事务的首选方法是使用EJB CMT(容器托管交易):CMT是陈述管理的一种形式(不同于程序交易管理)。EJB CMT取消了JNDI搜索交易相关的JNDI搜索的需求,尽管使用了它,尽管使用它来使用ITEJB本身需要使用JNDI。CMT的缺点与JTA和Application Server相关联。此外,它需要在EJB中选择业务逻辑,或者至少在EJB出现之后。从eJB出现,EJB的负面影响是如此之大,以至于这不是一个有吸引力的建议,这不是一个有吸引力的建议,特别是在面对陈述管理的有吸引力的替代方案时。

  本地事务是针对资源的特定资源的,例如与JDBC相关的事务。本地事务可能更易于使用,但是有更大的缺点:它们不能在多个交易资源中崩溃。在全局JTA事务中使用。由于应用程序服务器不处理事务管理,因此无法确定多个交易的正确性。(值得注意的是,大多数应用程序是单个交易资源。)另一个缺点是本地事务在侵入性中是侵入性的。编程模型。

  Spring解决了全球事务和本地事务的缺点。它使用应用程序开发人员在任何环境中使用一致性编程模型。用户更喜欢声明的交易管理,在大多数情况下建议使用。

  通过编程交易管理,开发人员使用弹簧帧的抽象,这可以在任何交易管理基础架构中。使用更受欢迎的语句模式开发人员通常很少或不编写代码以使用交易管理,因此它不依赖于Spring Framework API和其他交易API。

  春季抽象的关键是交易策略的概念。交易策略由org.springframework.transactions.platformtransactions定义。

  这是主要的服务提供商界面(SPI),尽管可以通过在应用程序代码中编程使用它。由于PlatformTransActionManager是一个接口,它可以根据需要轻松模拟或存放根。它不取决于JNDI.The诸如JNDI。PlatformTransactionManager的实现是在弹簧框架IOC容器中的任何其他对象中定义的。

  再次有了Spring的理念,可以通过任何平台进行分发的任何方式来抛出UntarcationXception。基本功能失败始终是致命的。在很少情况下,实际上可以从交易失败中恢复应用代码。应用程序开发人员仍然可以选择捕获和处理TransActionException。关键是开发人员没有强迫这一点。

  GetTransaction(..)方法根据TransActionDefinition参数返回事务status对象。如果在呼叫堆栈中存在匹配的事务,返回的TrassActionStatus可以代表新事务或现有事务。后一种情况的含义是,就像上下文一样,在Java EE交易中,在执行线程中收集了一个事务status。

  TransActionDefinition接口规范:

  TransactionStatus接口提供了一种控制事务代码的执行和查询状态的简单方法。这些概念应该很熟悉,因为所有事务API都是常见的:

  无论您是否选择春季的陈述和编程进行交易管理,定义正确的PlatformTransactionManager实施绝对重要。您通常通过依赖注射来定义此实现。

  PlatformTransactions通常需要了解其工作的环境:JDBC,JTA,Hibernate等,下一个示例显示了您如何定义本地PlatformTransActionManager实现。(此示例适用于普通JDBC)。

  您定义JDBC数据源

  PlatformTransactionManager bean的定义定义了数据源的定义,如下所示:

  如果您在Java EE容器中使用JTA,则可以通过JNDI使用dateSource容器,并结合Spring的Jtatransactionager.jta和JNDI搜索版本如下:

  JtatransactionManager不需要了解数据源,即某些特定来源,因为它使用了全局交易管理。

  您可以轻松地使用Hibernate的本地事务,就像下面的示例一样。在这种情况下,您需要定义冬眠的LocalsessessessessionFactoryBean,它将在代码中使用Hibernate Session实例。

  DataSourceBean类似于定义本地JDBC。它已经显示了早期,因此未显示下面的示例。

  在示例中,txmanager bean属于HiberNateTransActionManager Type。例如DateSourCetransactionManager,需要一个数据源参考。HibernatetractionManager需要引用SessionFactory。

  如果您使用Hibernate和Java EE容器来管理JTA交易,则应简单地使用与以前的JDBC JTA示例相同的JTATRANACTIONAGER。

  您现在应该知道如何创建不同的交易以及它们如何链接到需要同步的相关资源(例如datasourcetransactionsactionsager同步JDBC dataSource,HiberNaTetractionManager关联了Hibernate sessionFactory等。)JDBC,Hibernate或JDO,以确保创建,重复使用并正确清理这些资源。本节还讨论了如何通过相关的平台转移来同步交易(可选)交易同步。

  首选方法是根据API的持续集成使用Spring的高级模板,或使用交易意识的工厂豆或代理来管理本地ORM API。这些交易感知解决方案过程,重复使用,清理,可选的交易资源同步和异常因此,内部映射。因此,用户数据访问不需要处理这些任务,但可以专注于集中耐用的非模型逻辑代码。在正常情况下,您可以使用本地ORM API或使用JDBC访问模板来使用JDBC访问模板方法使用JDBCTEMPLATE。这些治疗方法在本参考文档的后续章节中详细介绍。

  例如DataSourceunters(用于JDBC),EntityManagerFactoryUtils(用于JPA),SessionFactoryUtils,PersistencEnceMemanagerFactoryUtil(用于JDO)和其他低级别类别。这些类,以确保适当的弹簧框架管理实例,交易(可选)同步,过程中的异常是正确映射到一致的,当同一时间正确以保持异常的发生是正确的一致性时,该过程中的一致性是正确的。在性爱中。

  例如,在使用JDBC的情况下,请替换传统的JDBC方法在DataSource上调用getConnection()方法,但使用org.springframework.jdbc.datasourceutils如下:如下:如下:如下:

  如果事务中存在同步连接,它将返回此实例。否则,该方法调用以触发新连接的创建。连接(可选)与任何现有事务同步,可用于交易中的后续重复使用。如前所述,在弹簧框架中包含的coadgetJdbConectineException中包含一些SQL异常。它是Spring Framework不合格的DataAccessexceptiion。该方法获得的信息比SQLEXception中的更多信息,并确保跨越不同的数据库甚至跨越不同的持久技术是方便的。

  此方法还可以生效任何春季过渡管理(交易同步是可选的),因此无论使用春季交易管理,您都可以使用它。

  当然,一旦您使用Spring的JDBC支持,JPA支持或Hibernate Support,您通常不会使用dataSourceutils或其他帮助类,因为春季抽象比直接使用相关API都更快乐。如果您使用Spring JDBCTEMPLATE(内部datasourceutils)或JDBC)或JDBC。为了简化您对JDBC的使用,正确的连接发生在幕后,您无需编写任何特殊代码。

  底层中有一个TransactionAwardArceproxy类。这是目标数据源的代理,包装目标数据源并添加了意识的弹簧管理交易。在这方面,它类似于JAVA EE服务器提供的交易JNDI数据。

  除非您必须调用现有代码并通过标准的JDBC数据源接口实现。在这种情况下,此代码可以可用,但是参与弹簧托管事务。上面提到的抽象方法编写您的新代码。

  大多数春季框架用户声明交易管理。此选择的最小入侵应用程序代码,因此与非无创的轻质容器的概念最一致。

  通过以春季为导向的编程(AOP),可以使用Spring Framework的声明管理。尽管交易剪切代码与弹簧框架一起发布,并且可以在模型中使用,但AOP概念通常是有效的。没有必要理解。

  Spring Framework的交易管理类似于EJB CMT,因为您可以指定指定为单个方法级别的事务行为(或错过)。如果有必要,您可以在上下文中调用SetRoombackonly()。这两个交易之间的差异为以下内容:

  回滚的概念非常重要:他们确保您指定了哪些异常(和抛售)应自动回滚。您应在配置中而不是在Java代码中指定此语句。交易status对象回滚当前事务。在大多数情况下,您可以指定一个规则:myApplicationException必须始终回滚。此选项的明显优势是业务对象不依赖事务的底部。例如,它们通常不需要导入春季过渡API或其他春季API。

  尽管EJB容器的默认行为会在系统异常(通常在运行时异常)自动回到此交易中,但是EJB CMT不是应用程序异常(即Java.rmi.remoteexception的测试例外)。默认行为。在声明性交易管理的弹簧中,EJB协议遵循EJB协议(在未选中的例外自动回滚),但定制的行为通常很有用。

  仅仅告诉您简单地使用注释@transactional即可在课堂上发表评论是不够的,请在配置中添加@nabetractionManagement,然后期望您了解其工作原理。在本节中,在春季框架底部声明的春季框架。

  关于春季框架的陈述,需要掌握最重要的概念是支持该AOP代理,交易的建议是由元数据驱动的(当前基于XML-or的注释).AOP和TRASSACTION METADATA COMPINATIONS生成一个AOP代理(通过Transaction Interceptor和合适的PlatformTransActionManager来驱动事务以激活方法)。

  从概念的角度来看,呼吁事务机构的方法看起来像这样...

  考虑到以下接口及其伴奏。此示例将FOO和条类作为占位符,以便您可以将精力集中在交易而不是在特定字段中。就示例而言,DefaultFooService类非常非常在每种方法的实现中,都很好地抛出一个无支撑杆菌的示例。它使您可以看到创建事务并卷回到UnsupportoperationException实例。

  假设必须在可读交易的上下文中执行前两种方法getfoo(string)和getfoo(字符串,字符串)。以下各节中将详细说明以下配置。

  检查先前的配置。在默认交易语义中执行”标签的交易量属性设置为促进PlatformTransActionManager属性的名称。在此示例中,它是txmanager bean。

  该定义可确保TXADVICE BEAN在程序的适当点上定义交易建议。首先定义一个与任何Fooservice接口方法匹配的切点(称为FooserveCeoperation)。Fooserviceoperation的作品表明,将执行TXADVICE。

  元素中的定义表达是切割点的切割的表达。春季的表面表达更多详细信息查看第10章,春季面向面向的编程。

  一个普遍的需求是使整个服务层事务。最好的方法是对切点表达式进行简单的更改,以匹配您的服务层中的任何方法。如下:

  现在我们已经分析了配置,您可能会问自己:“好吧……但是这些配置实际上是做了什么?”

  上面的配置将用于创建代理,以创建由Fooservice Bean生成的对象周围的事务。此代理将使用交易建议配置,以调整代理上的适当方法,启动,暂停,暂停,暂停,暂停,根据与此方法关联的交易配置标记为可读等。考虑以下程序测试驱动程序的配置。

  输出如下

  在上一节中,应用程序中的交易配置(通常是服务层)在您的应用程序中指定的基本知识。本节介绍了如何以简单的方式控制交易的回滚。

  推荐的方法是通过弹簧框架的交易框架声明。交易的工作将在交易当前执行的代码上下文中丢弃。SpringFramework的基础代码将捕获任何未经处理的异常(当它从呼叫堆栈中出来时)并确定交易是否标记作为回滚。

  在其默认配置中,Spring Framework的基础代码仅在不需要检查运行时标记了交易,也就是说,当RuntimeException不异常时。配置,在事务方法上抛出异常不会回滚。

  您可以准确地配置那些异常类型以标记交易滚动,包括检查异常。以下XML小片段显示如何配置通过检查指定的异常类型,将其应用于检查-ups。

  当异常抛弃时,如果您不想退回交易,也可以指定“无回滚规则”,如下:

  当Spring Framework的基础代码捕获异常和参考配置回滚规则以确定交易是否被标记为回滚,最强的匹配规则将获胜。因此,在下面的配置下,其他异常情况伴随着事务。

  您还可以以编程方式声明所需的回滚。尽管它非常简单,但此过程非常具有侵入性,并且您的代码与Spring Framework的交易框架紧密相结合:

  您正在通过强烈的鼓励尽可能多地作为声明。如果您绝对需要它,则可以使用编程来回滚,但是它的用途正与干净的Pojo框架相反。

  考虑到这样的场景,您有多个服务层对象,并且要对它们应用完全不同的交易。您通过不同的定义通过不同的定义通过不同的属性值通过元素来执行此操作。

  作为比较,首先,假设您的所有服务层类都是在root x.y.service package中定义的默认交易配置。您将写如下:

  以下示例显示了如何配置使用完全不同交易的两个不同的豆类。

  本节总结了标签指定的各种交易配置。默认配置为:

  您可以更改这些默认配置;标签的不同属性是嵌套的,标签总结如下:

  与事务属性关联的名称。passmarking()与多个方法相同的交易属性设置关联。例如,get,handle,onevent和其他propahationNoreQuired交易差异。ISOLATIONNODFAULTTRASSACTION隔离级别。TimeOutNo-1传输(以秒为单位)读取一通用的交易,仅读取?回滚fornoeexception(S)触发触发回滚的使用;分段。例如,com.foo.mybusinessexception,serviceTexception.no-rollback-fanoexception(s)不会触发退回使用;分段。例如,com.foo.mybusinessexception,servicetexception。除了使用基于XML语句的配置外,您还可以使用注释方法。语句的语义直接声明它更接近Java源代码上的受影响的代码。没有过多耦合的风险,因为它是更多方便使用代码上的交易。

  最好使用一个示例使用@transactional注释来解释它。解释以下文本。考虑类定义:

  当上述POJO在弹簧IOC容器中定义为BEAN时,只能通过使用交易来使用BEAN实例:一系列事务配置:

  如果要连接的platformTractionManager的bean名称具有name trassactionManager,则可以省略标记中的事务管理器属性。如果您要依靠注射platformating platformTransactionsManager bean,则必须有任何其他名称,那么您必须显示该显示。如上一个示例所示,使用事务管理器属性。

  如果使用基于Java的配置,则 @enabletransactionsmanagement注释提供相同的支持。简单地添加@configuration class。详细介绍Javadocs。

  当使用代理时,您应仅在公共方法上应用@transactional注释。如果您对受保护,私有或包裹可见方法评论,则不会引起任何错误,但是出现的方法不会显示配置交易设置。如果您需要评论非公共方法,则可以考虑使用aCTEACKJ(见下文)。

  您可以在接口定义,接口方法,类定义或类公共方法中使用注释。但是,@transactions的存在不足以激活交易。- 意见可以使用此元数据在适当的bean上配置交易。在上一个示例中,>元素打开了事务。

  考虑到使用factexj模式(请参阅下表中的属性),如果您期望自己的呼叫,则将打包。在这种情况下,首先不会有代理;相反的目标类是编织的(也就是说,其字节的字节代码已修改),因此 @transactional以任何类型的方法进入运行时。

  TX:注释驱动的配置XML属性|注释属性|默认|描述|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------参见TransactionManagementConfigurer Javadocs)|TransActionManager |使用事务管理名称。名称管理名称不需要TransActionManager,如上所示。模式|代理|BEAN注意到默认模式“代理”到处理交易AOP框架代理(遵循代理语义,上述方法应用于通过代理的方法)。其他“方面”模式是使用受影响的类和类别的类和Spring expactj交易方面将此目标字节代码应用于不同类型的回调。ASPECTJ编译要求spring-aspects.jar在classPath和translation中的jar和translation(或及时编译)启用加载(或及时编译)。加载时要了解详细设置的“春季配置”部分.proxy-target-class |ProxyTargetClass |false |仅适用于代理模式。 @Transactions创建了哪种类型的事务代理来控制哪种类型的事务代理。如果代理 - target-target-class属性设置为true,然后创建基于类的代理。如果代理 - 目标类是错误的或忽略了此属性,则基于接口代理创建标准JDK。(有关不同代理类型的详细咨询,请参见第10.6节“代理机制”。)订单|订单|ordred.lowest_precedence |定义是由使用 @transactional的Bean交易的建议顺序定义的。(关于更多相关的AOP建议序列的规则,请参见称为“建议顺序”的部分。)没有指定的排序意味着AOP子系统确定建议的建议。)

  @enltransactionagement和 @transactional在bean上仅找到相同的应用程序上下文。这意味着如果您将注释驱动程序配置放在webapplicationcontext的dispatcherServlet而不是您的服务中。请参阅第21.2节,“ dispatcherservlet”。

  设置评估方法后,首选底部位置。在下面的示例中,默认服务类被注释以在此级别上仅设置交易,但是此注释@Trasactional比同一注释的同一注释定义更优先此UpdateFoo(FOO)方法中的定义。

  @Transactional注释是必须具有事务语义的指定接口,类和方法;例如,当调用方法时,启动一个新的读取交易并暂停任何现有事务。@Transactional的默认配置如下:

  传播|枚举:传播|交易沟通行为。|ISLATION |枚举:隔离||事务隔离级别。int |你只读吗?|只读|布尔|它只是读吗?|回滚|类对象数组。类必须继承可抛出的。| |异常触发回滚使用;分段。例如,com.foo.mybusinessexception,servicetexception。|无滚动|lass对象数组。类必须继承可投掷|异常,而无需触发回滚的使用;司。|

  您目前无法清楚地控制交易的名称。此名称意味着此交易的名称在事务监视器中显示在适当的情况下(例如,weblogic的事务监视器)和日志中的输出。进行性事务声明,交易名称的名称始终是方法名称全限制的类名称+“。”+交易式的类。例如,如果handlepayment(..)方法的businessService类(..)开始交易。

  大多数春季应用程序只需要一个交易管理器,但是您可能需要在一个应用程序中使用多个独立的事务管理器。事务管理器bean或限定器值的名称。例如,在下面的Java代码中使用

  它可以与以下应用程序上下文交易管理BEAN定义结合使用。

  在这种情况下,这两种交易库服务上的两种方法将在交易管理分离下的“订单”和“帐户”标识的分离下。如果找不到有限的PlatformTransActionManager bean,则将使用默认的目标bean transactionmer。

  如果您发现需要以不同的方式重复使用相同的@transactions属性,那么春季的元注射支持使您可以允许您为特殊用途定义简短的注释。例如,定义以下注释

  让我们在上一节中写下示例

  在这里,我们使用交易管理有限符号的语法定义,但还可以包括传播行为,回滚规则,超时等。

  本节介绍了春季交易传播的一些语义。请注意,本节不是交易传播本身的简介。它解释了有关春季交易通信的一些语义。

  在春季的托管交易中,请注意不同的身体和逻辑事务,以及如何与这种差异建立沟通。

  当popagation_required设置,当通信设置被paspagation_required时,应用程序设置的每种方法都会创建逻辑交易范围。每个逻辑交易范围都可以单独确定,并且外部交易的范围可以独立于内部交易的范围,。

  但是,如果内部交易范围设置仅回滚,那么对外事务并没有自行回滚,因此这种翻转是出乎意料的(内部事务范围以无声的方式触发)。在这一点上,请注意相应的不超高backexception。这是一种预期的行为,因此交易呼叫者永远不会误导认为执行提交并且实际上没有执行。返回,外部事务仍被调用并提交。外部卡特人需要接收一个不符合的backexception,以便清楚地表明它们已更改为回滚。

  propagation_requires_new和propagation_required比较,在每个效果的范围上使用完整的独立交易。在这种情况下,基础事务是不同的,因此可以独立提交和滚动。外交不受内政状态的影响。

  propagation_nested使用单个物理交易,可以通过多项交易来回滚。本地翻转运行嵌入式交易以返回其范围内,外部事务可以继续进行物理事务,尽管某些操作已回滚,但此设置通常是在此设置。JDBC安全点,因此仅在JDBC的支持下才能生效。请参阅Spring的DataSourCetransactionManager。

  假设您要执行交易和一些基本的分析建议。您如何在上下文标签上实现此信息?

  当您要调用UpdateFoo(FOO)方法时,您想查看以下操作:

  这不涉及详细的解释AOP(除非适用于交易)。请请参阅第10章,春季面向面向的编程,以获取更详细的AOP和AOP总体介绍。

  这里讨论的简单分析方面代码。建议顺序应通过订单接口进行控制。有关更详细的建议顺序,请参阅“建议订购”。

  上述配置的结果是在Fooservice Bean中使用分析和交易的顺序。您可以使用类似的方式来配置任何其他切割表面。

  以下示例与上面的配置相同,但是使用了纯XNL声明方法。

  如果您想使用这种方式让分析建议在交易建议或交易建议之前执行,那么您可以将分析方面的顺序属性值替换为比交易建议的顺序更高的值。

  您还可以使用 @transactional的 @transactional of Spring Fracework在弹簧容器外的 @TransActional。为此,您选择使用@transactional在课堂上发表评论(也可以是您的类方法),然后您使用org.springframework。元素作为方面依赖于交易管理方面注入的描述。由于我们正在关注弹簧容器之外运行的应用程序,因此我们将向您展示如何以编程方式实施它。

  当您使用方面时,必须注释类(或类方法)的实现,而没有类的实现接口。请参见接口上的注释是无法继承的Java规则。

  @transaction的@transactional注释是通过执行该类的任何方法指定默认交易语义的。。

  要使用AnnoTationTransactionapect编织应用程序,必须使用apkectj(请参阅axpectJ开发指南)或在运行时编译并构建应用程序。请参阅第10.8.4节“使用appectj在弹簧框架中编译”。

  春季框架提供了两项编程交易:

  春季团队通常建议您使用TransactionTemplate进行编程交易管理。第二个类似于使用JTA UserTransaction API,尽管它并不那么笨重,尽管它并不那么笨重。

  TransActionTemplate使用与其他弹簧模板(例如JDBCTEMPLATE)相同的方式。它使用回滚方法从必须获得和释放的交易资源中释放应用程序代码,并且根据意图在代理中生成结果,因此开发人员可以编写。根据他们自己的意图,代码。

  如您在以下示例中看到的那样,使用TrassActionTemplate显然将您与Spring的交易基础架构和API结合在一起。适当的编程管理取决于您的开发需求。你必须决定自己。

  该代码应在事务的上下文上执行,并在下面显示显示的使用TrassActionTemplate。作为应用程序开发人员,您可以编写一个包含您需要在此中执行的代码的TransactionCallback实现类(通常代表匿名内部类)交易的上下文。然后,您可以执行执行(...)方法来通过您的自定义callback方法执行执行(...)方法。

  如果这里没有返回值,请使用匿名便利transactionCallbackWithoutresult类,如下:

  回调代码可以在setrolllbackonly()滚动交易::提供的setrolllbackonly()提供的事务status对象中使用。

  您可以指定事务配置模式,隔离级别,加班等,并使用交易板配置或在配置中。TransactionStemplate示例具有默认设置。以下示例显示自定义TrassActionTemplate:

  以下示例使用Spring XML配置使用自定义1设置来定义交易板。可以根据需要将sharetransactions注入服务。

  最后,transactIntemplate实例是线程-SAFE,因此实例不维护任何会话状态。但是,transactontemplate保持配置状态,因此,当某些类可能共享TrassActionTemplate Singles实例时,如果类需要使用不同的配置交易术,则将您需要创建两个不同的交易板实例。

  您可以使用org.springwork.transaction.platformtransactionmanager直接管理交易。简而言之,请使用PlatformTransActionManager实例,并使用Bean在您的BEAN上引用BEAN。然后使用TrassActionDefining和TrassActionStatus对象开始,滚动,滚动并提交。

  当您有少量的交易操作时,通常关注编程交易管理。在这种情况下,使用TransActionTemplate可能是一种好方法。它可以显示仅通过编程管理才能完成的事务名称的设置。

  从Spring4.2开始,交易监视可以绑定到交易阶段。一个典型的例子是处理事件,当交易成功完成时:当前的交易结果在收听监视时实际上很重要,允许使用事件更多灵活。

  注册常规事件监视是通过@EventListener Annotations。如果您需要将其绑定到当前事务,请使用 @transactionaleventlistener.do将其绑定到交易提交阶段。

  让我们给我们一个示例来澄清这一概念。请说,组件发布了创建事件的订单,我们定义了侦听器,在成功提交交易后,应触发侦听器:侦听器应触发:

  TrassActionLeventListener Note披露阶段属性允许您在不同阶段将设备自定义为监视设备。BEFORE_COMMIT,after_commit,after_rollback和after_completion(无论是提交还是滚动)。

  如果没有交易正在运行,则根本不会调用侦听器,因为我们不能遵守所需的语义。

  春季的事务抽象通常与应用程序服务无关。此外,Spring的JtatransactionAger类可以选择执行JNDI搜索JTA用户trananaction和TransactionManager对象,以自动检测后一个对象的位置。该位置与应用程序服务器不同。JTA交易的访问增强了语义语义,尤其是暂停事务。有关更多详细信息,请参见Jtatransactionger Javadoc。

  Spring的JtatRactionManger是在Javaee应用程序上运行的标准选择,并且可以运行所有共同的服务。诸如交易悬架等高级功能也适用于许多服务器 - 包括Glassfish,JBOSS,GERONIMO,不需要任何特殊配置。Spring的暂停交易和更高级的功能为WebLogic和WebSphere提供了特殊的适配器。以下章节将讨论这些适配器。

  对于包括WebLogic Server和WebSphere在内的标准方案,请考虑使用方便的配置元素。配置后,此元素自动检测基础服务并选择平台来管理最佳交易。这意味着您不需要配置特定的服务适配器类(如下所述).INSTEAD,使用标准Jtatransactionger作为默认储备,将自动选择它们。

  在WebSphere 6.1.0.9及更高版本上,推荐的Spring JTA交易管理是WebSpheruowTractionManager。此特殊适配器使用IBM的UOWMANAGER API,WebSphere Application在WebSphere Application Server 6.0.2.19和更高版本的UOWMANAGER API,6.1.0.0.9和更高版本。IBM正式支持了弹簧驱动的交易(由popagation_requires_new引起的悬挂和恢复)。

  Weblogic Server 9.0或更高版本,您通常使用WebLogicJtatRansactionManager代替替代JTATRANACTIONAGER类。这种特殊的WebLogic特定的常规JTATRANSACTIONAGER子类支持Spring交易的所有功能在WebLogic管理交易环境中的所有功能。超出标准的JTA语义:特征包括交易名称,每个交易隔离级别以及在所有情况下正确的事务。

  根据您选择的交易技术和要求,请使用正确的PlatformTranactionger实现。使用适当的情况,Spring Framework仅提供简单且合适的抽象。如果您使用全局交易,则必须使用org.springframework.transaction.jta.jtatraction manager class(或一个应用程序服务 - 特定的JTATRANACTIONAGER子类,用于您的所有交易操作。否则,交易基础架构将尝试在诸如容器数据源实例之类的资源上执行本地事务,例如本地事务毫无意义,良好的应用程序服务器将把它们视为错误。

  有关春季框架事务的更多信息: