一尘不染

“Spring交易”和“Hibernate交易”有什么区别

hibernate

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

  1. Hibernate交易
  2. Spring交易

我也想了解@Transactional注释。


阅读 193

收藏
2020-06-20

共1个答案

一尘不染

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

TL; DR

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

长话说:

交易次数

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

hibernate

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

弹簧

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

Spring被设计为用作应用程序中对象和服务的全方位主控,因此,它的事务概念比hibernate相关的数据库特定事务更高。Spring事务旨在让您对所有事务资源进行细粒度的控制,同时抽象出协调事务所需的通常混乱的编码。

@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管理代码。

2020-06-20