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

时间:2011-05-11 10:05:02

标签: spring transactions

我正在使用Spring Framework 3.0.5和Hibernate Framework,我现在开始使用Springs Transactionmanagement。我有一些问题,只是为了理解Springs Transactionmanagement的工作原理。

1)

我在Spring参考中读到了这些东西:

  

a)跨不同事务API的一致编程模型,例如Java Transaction API(JTA),JDBC,Hibernate,Java Persistence API(JPA)和Java Data Objects(JDO)。

     

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

     

c)使用EJB CMT或JTA的唯一替代方法是使用本地事务(例如JDBC连接上的代码)编写代码,并且如果您需要在全局,容器中运行代码,则会面临大量的返工。管理交易。使用Spring Framework,只需要更改配置文件中的一些bean定义,而不是代码。

从a)我明白我可以将这些API与Spring 一起使用而不用更改代码

从b)我明白我可以使用全局或本地交易* 而不用更改代码

从c)我明白,在不同的API和全球/本地交易之间切换时,我需要更改代码

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

=> 我是否需要更改代码?在不同的API之间切换时?在本地和全球交易之间切换? (或者它可能取决于prorgammatic和声明式事务管理?)

2)

我还有一个问题:我真的很想知道程序化事务管理的使用是什么?我读到的每个地方都建议使用声明式交易管理

我也在春季参考中读到了这个:

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

从d)我明白:使用程序化事务管理我可以使用任何底层交易基础设施......这意味着什么?上面提到的不同的API?

和:声明我不依赖任何api

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

区别在哪里?我只知道声明式事务管理更轻量级,我不能自己启动事务并捕获异常并处理它等等。但那么程序化交易管理的用途是什么呢?

感谢您的回答! : - )

1 个答案:

答案 0 :(得分:2)

  1. 你有点过分思考。 Spring API提供了一个抽象事务模型,它具有相同的API和语义,无论您使用哪种底层事务技术。为了从一种技术切换到另一种技术,您通常必须更改Spring配置,但我们的想法是您永远不需要改变您的业务逻辑。因此,无论您是使用本地,虚拟机内JDBC事务还是完全分布式,两阶段提交XA JPA样式的事务,Spring代码中的API使用情况都是相同的。只有配置更改。

  2. 声明式和程序式事务管理之间的区别在于,使用前者,您可以使用注释或XML配置来说明哪些代码应该是事务性的。使用编程风格,您可以使用方法调用将事务逻辑专门包含在Spring API中。请注意,如果使用声明式样式,则Spring会将您的代码包装在使用编程样式的生成逻辑中。后者只是前者更明确,更低级的版本。它为您提供了更多控制权,但它更加冗长。