Springs 事务管理 - 了解 Spring 引用,全局/本地,编程/声明式 - 两个问题



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

1)

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

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

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

c) 使用

EJB CMT 或 JTA 的唯一替代方法是使用本地事务(例如 JDBC 连接上的事务)编写代码的日子已经一去不复返了,如果您需要该代码在全局容器管理的事务中运行,则需要大量返工。使用 Spring 框架,只需要更改配置文件中的一些 Bean 定义,而不是代码。

从一)我知道我可以在 Spring 中使用这些 API,而无需更改代码

从 b)我了解我可以使用全局或本地事务*无需更改代码

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

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

=> 我需要更改代码吗?在不同 API 之间切换时?在本地和全球事务之间切换时?(或者它是否可能依赖于专有和声明式事务管理?

2)

我还得到了一个额外的问题:我真的想知道程序化事务管理的用途是什么?我到处都建议使用声明式事务管理

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

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

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

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

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

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

感谢您的回答! :-)

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

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

最新更新