Spring事务管理-了解Spring参考、全局/本地、编程/声明-两个问题

Spring事务管理-了解Spring参考、全局/本地、编程/声明-两个问题,spring,transactions,Spring,Transactions,我正在使用SpringFramework 3.0.5和Hibernate框架,现在我开始使用SpringTransactionManagement。我有一些问题,只是想了解Springs Transactionmanagement是如何工作的 1) 我在Spring参考资料中读到: a) 跨不同事务API(如Java事务API(JTA)、JDBC、Hibernate、Java持久性API(JPA)和Java数据对象(JDO)的一致编程模型 b) Spring解决了全局和本地事务的缺点。它使应用程

我正在使用SpringFramework 3.0.5和Hibernate框架,现在我开始使用SpringTransactionManagement。我有一些问题,只是想了解Springs Transactionmanagement是如何工作的

1)

我在Spring参考资料中读到:

a) 跨不同事务API(如Java事务API(JTA)、JDBC、Hibernate、Java持久性API(JPA)和Java数据对象(JDO)的一致编程模型

b) Spring解决了全局和本地事务的缺点。它使应用程序开发人员能够在任何环境中使用一致的编程模型。您只需编写一次代码,就可以从不同环境中的不同事务管理策略中获益

c) 使用EJBCMT或JTA的唯一替代方法是使用本地事务(如JDBC连接上的事务)编写代码的日子一去不复返了,如果您需要在全局容器管理的事务中运行代码,那么代码将面临巨大的返工。使用Spring框架,只需要更改配置文件中的一些bean定义,而不需要更改代码

从a)我了解到,我可以将这些API与Spring一起使用,而无需更改代码

从b)我了解到我可以在不更改代码的情况下使用全局或本地事务*

从c)我了解到,在不同API和全局/本地事务之间切换时,我需要更改代码

现在我想知道什么是正确的

=>我需要更改代码吗?在不同的API之间切换时?在本地和全局事务之间切换时?(或者它是否可能依赖于Prorgamatic和declarative事务管理?)

2)

我还有一个问题:我真的想知道编程事务管理的用途是什么?我读到的每一篇文章都建议使用声明式事务管理

我在spring参考中也读到了这一点:

d) 通过编程事务管理,开发人员使用Spring框架事务抽象,它可以运行在任何底层事务基础设施上。使用首选的声明性模型,开发人员通常只编写很少或没有编写与事务管理相关的代码,因此不依赖于Spring框架事务API或任何其他事务API

从d)我了解到:通过编程事务管理,我可以使用任何底层事务基础设施。。。这意味着什么?上面提到的不同API

并且:使用声明式,我不依赖于任何api

=>这不一样吗?当我可以使用任何底层api时,我不依赖任何api。我真的不明白这一点

区别在哪里?我只知道声明性事务管理更轻量级,我不必自己启动事务,捕获异常并处理它,等等。但是编程事务管理有什么用呢

谢谢你的回答!:-)

  • 你想得太多了。SpringAPI提供了一个抽象事务模型,该模型具有相同的API和语义,无论您使用哪种底层事务技术。为了从一种技术切换到另一种技术,您通常必须更改Spring配置,但这样做的目的是您永远不需要更改业务逻辑。因此,无论您使用的是本地、VM JDBC事务还是完全分布式、两阶段提交XA JPA样式的事务,Spring代码中的API用法都是相同的。只有配置更改

  • 声明式和编程式事务管理之间的区别在于,对于前者,您可以使用注释或XML配置来说明哪些代码位应该是事务性的。使用编程风格,您可以使用方法调用将事务逻辑专门封装到SpringAPI中。请注意,如果使用声明式样式,那么Spring将在使用编程样式的生成逻辑中封装代码。后者只是前者的一个更明确、更低级的版本。它给了你更多的控制,但它更冗长


  • 回答得很好,谢谢!为了确保我理解:1)在不同的API和/或全局/本地事务之间切换时,我不必更改代码,只需更改配置。对的2)我想我理解这一点,但我想知道如果我使用编程事务管理并希望切换API(或在全局/本地事务之间切换),会发生什么?那么我必须对我的代码进行修改,还是不修改?我还了解到,在使用decl时,我有更多的选项来定义事务行为。transman,但这肯定是错误的,对吗?谢谢:-)@nano7:1)更正声明性/编程性更改意味着使用SpringAPI的不同部分,因此这涉及到代码更改。2) 编程API独立于底层技术,就像声明式风格一样。当使用编程风格时,您可以获得更大的灵活性,但您很少需要这种灵活性。帮助,我不确定我是否理解这一点:a)->当我使用声明式API时,我想将例如从Hibernate(带有JDBC)更改为JTA,我不必更改代码,只需更改配置。b) ->当我使用编程API并且我想从Hibernate(使用JDBC)更改为JTA时,我必须更改代码和配置=>因此使用编程API的缺点是在JTA、JDO、JPA、JDBC之间切换时必须更改代码。。。。等等对吗-(谢谢!:-)@nano7:No:编程API独立于底层技术,就像声明式API一样。哦,好的。很抱歉所以,不