“Spring 事务”和“Hibernate 事务”有啥区别
Posted
技术标签:
【中文标题】“Spring 事务”和“Hibernate 事务”有啥区别【英文标题】:What is the difference between a "Spring transaction" and a "Hibernate transaction"“Spring 事务”和“Hibernate 事务”有什么区别 【发布时间】:2015-05-10 23:58:59 【问题描述】:能否请您解释一下以下两种交易类型的区别:
-
休眠事务
春季交易
我也想知道@Transactional
注解。
【问题讨论】:
Spring 事务管理器(如果配置正确)可以管理休眠事务。@Transactional
是在Spring
中声明事务方法的方式。所以区别与车轮和方向盘的区别是一样的,当“配置正确”时,旋转方向盘会移动车轮......两者都是***:)。
【参考方案1】:
对于初学者来说,它们都是事务,但它们包含不同的概念和组件。
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管理代码。
【讨论】:
【参考方案2】:编码级别尊重
春天
在Spring中,我们可以执行如下事务
@Transactional(readOnly=”false”)
public int insert(int studentId, String name, int courseId)
int outcome = 0;
outcome = studentDao.insert(studentId, name);
if (outcome > 0)
// re-intialize
outcome = 0;
outcome = studentCourseDao.insert(studentId, courseId);
return outcome;
看到@Transactional 后,Spring IOC 容器将要执行事务。如果两者都操作成功,则将执行提交操作。如果任何操作失败,则将执行回滚操作。
休眠
在 Hibernate 中我们可以执行如下事务
public int insert(Student student, Course course)
//it is a flag driven transaction
boolean flag = false;
Transaction transaction = null;
Session session = null;
SessionFactory sessionFactoryRepo = null;
try
sessionFactoryRepo = SessionFactoryRepo.getsessionFactory();
session = sessionFactoryRepo.openSession();
// here we are creating the transaction object
transaction = session.beginTransaction();
int outcome = 0;
outcome =session.save(student);
if (outcome > 0)
// re-intialize
outcome = 0;
outcome = session.save(course);
flag = true;
return outcome;
catch (Exception e)
// TODO: handle exception
finally
if (flag == true)
transaction.commit();
else
transaction.rollback();
【讨论】:
以上是关于“Spring 事务”和“Hibernate 事务”有啥区别的主要内容,如果未能解决你的问题,请参考以下文章