“Spring事务”和“Hibernate事务”之间有什么区别

能否请您解释以下两种交易之间的区别:

  1. Hibernate事务
  2. 春季交易

另外我想知道@Transactional注释。

对于初学者来说,他们都是交易,但它们包含不同的概念和组件。

TL; DR

Hibernate处理数据库特定的事务,而spring提供一般的事务管理服务。 @Transactional是配置事务管理行为的好方法。

长篇故事:

交易

事务基本上是工作单元(即对某些事物的更改),它们作为可以提交或回滚的单个操作进行管理。 Java世界中有许多不同类型的事务 – 数据库,JMS之类的消息传递系统,应用程序间事务(对于那些不是胆小的人)或者可能需要包含在事务中的任何其他事务。 在Java标准中,使用Java Transaction API管理事务 ,该API设置如何参与事务的规则。

过冬

Hibernate是用于将数据库组件抽象为Java对象的ORM,因此其事务与数据库中所做的更改具体相关。 事务可以由对各种数据库表的一次或多次写入组成,这些数据库表一旦操作完成就全部提交。 回滚事务,例如,在操作期间存在任何错误,允许撤消所有更改。

弹簧

在最低级别, Spring是一个用于管理对象之间的配置和依赖关系的应用程序框架。 此外,它还提供了一个用于管理现代应用程序(如数据库,消息传递服务,MVC框架和事务)中使用的更高级别服务的接口。

Spring旨在用作应用程序中包含对象和服务的无所不包的主机,因此它的事务概念比hibernate关注的数据库特定事务处于更高级别。 Spring Transactions旨在为您提供对所有事务资源的精细控制,同时抽象出协调事务所需的经常混乱的编码。

@Transactional

Spring提供了一些使用事务的不同方法 – 其中包括基于xml的方面,对API的编码和基于注释的声明性事务。 基于注释的事务很方便,因为您不需要将事务管理样板代码添加到您的应用程序(即使使用PlatformTransactionManager通过API也有相当多的编码开销)。

所以@Transactional基本上发生的事情是,在运行时,sp​​ring会扫描你的代码库以获取@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管理代码。