您能否解释以下两种交易类型之间的区别:
我也想了解@Transactional注释。
@Transactional
对于初学者来说,它们都是事务,但是它们包含不同的概念和组件。
TL; DR
Hibernate处理数据库特定的事务,而spring提供常规的事务管理服务。@Transactional是配置事务管理行为的好方法。
长话说:
交易次数
事务基本上是工作的单元(即,对某事物的更改),可以作为可提交或回滚的单个操作进行管理。在Java世界中,有许多不同类型的事务- 数据库,像JMS这样的消息传递系统,应用程序间事务(适用于那些不太胆小的人)或事务中可能需要包含的其他任何事物。在Java标准中,交易是使用Java交易API进行管理的,该 API设置了如何参与交易的规则。
hibernate
Hibernate是一个ORM,用于将数据库组件抽象为Java对象,因此其事务与数据库中的更改特别相关。事务可由对各种数据库表的一次或多次写操作组成,一旦完成操作,这些写操作将全部提交。回滚事务,例如,如果操作期间发生任何错误,则允许撤消所有更改。
弹簧
在最低层次上,Spring 是一个用于管理对象之间的配置和依赖关系的应用程序框架。此外,它还提供了一个接口,用于管理在现代应用程序中使用的高级服务,例如数据库,消息服务,MVC框架和事务。
Spring被设计为用作应用程序中对象和服务的全方位主控,因此,它的事务概念比hibernate相关的数据库特定事务更高。Spring事务旨在让您对所有事务资源进行细粒度的控制,同时抽象出协调事务所需的通常混乱的编码。
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管理代码。