对于初学者来说,它们都是事务,但它们包含不同的概念和组件。
TL;DR
Hibernate 处理特定于数据库的事务,而 Spring 提供一般事务管理服务。 @Transactional 是配置事务管理行为的好方法。
长篇大论:
交易
事务基本上是作为单个操作进行管理的工作单元(即对某些内容的更改),可以提交或回滚。 Java 世界中有许多不同类型的事务——数据库、消息传递系统(如 JMS)、应用程序间事务(适用于那些胆小的人)或任何其他可能需要包含在事务中的事务。在 Java 标准中,事务是使用 Java Transaction API 管理的,它设置了如何参与事务的规则。
休眠
Hibernate 是一种用于将数据库组件抽象为 Java 对象的 ORM,因此它的事务与数据库中所做的更改特别相关。一个事务可能由对各种数据库表的一次或多次写入组成,一旦操作完成,这些操作就会全部提交。回滚事务,例如在操作过程中出现任何错误,可以撤消所有更改。
春天
在其最低级别Spring 是一个应用程序框架,用于管理对象之间的配置和依赖关系。此外,它还提供了一个接口,用于管理现代应用程序中使用的更高级别的服务,例如数据库、消息传递服务、MVC 框架和事务。
Spring 被设计为在应用程序中用作对象和服务的无所不包的主人,因此它的事务概念比 hibernate 所关注的特定于数据库的事务处于更高的级别。 Spring Transactions 旨在为您提供对所有事务资源的细粒度控制,同时抽象出协调事务所需的通常混乱的编码。
@Transactional
Spring 提供了几种使用事务的不同方法——其中包括基于 xml 的方面、API 编码和基于注释的声明性事务。基于注释的事务很方便,因为您不需要将事务管理样板代码添加到您的应用程序中(即使通过 API 使用 PlatformTransactionManager 也有相当多的编码开销)。
所以基本上@Transactional 发生的情况是,在运行时,spring 会根据您通过注释配置的内容,扫描您的代码库中的 @Transactional 类和方法,并将它们包装在特定于事务的管理代码中。所以像这样的方法:
@Transactional(propagation = REQUIRES_NEW, rollbackFor = {Exception.class})
public void saveAndSendMessage(Foo foo) throws Exception {
dbManager.save(foo);
Bar bar = transform(foo);
jmsSystem.send(bar);
}
可以让spring为数据库和jms系统建立一个新的事务,并协调它们,而不需要自动添加所有特定的tx管理代码。