请您解释以下两种交易之间的区别:
另外,我想了解@Transactional
注释。
答案 0 :(得分:20)
对于初学者来说,他们都是交易,但它们包含不同的概念和组件。
<强> TL; DR 强>
Hibernate处理数据库特定的事务,而spring提供一般的事务管理服务。 @Transactional
是配置事务管理行为的好方法。
长篇故事:
<强>交易强>
事务基本上是工作单元(即对某些内容的更改),它们作为可以提交或回滚的单个操作进行管理。 Java世界中有许多不同类型的事务 - 数据库,JMS之类的消息传递系统,应用程序间事务(对于那些不是胆小的人)或者可能需要包含在事务中的任何其他事务。在Java标准中,使用Java Transaction API管理事务,Hibernate设置如何参与事务的规则。
<强>休眠强>
Spring是用于将数据库组件抽象为Java对象的ORM,因此其事务特别与数据库中所做的更改相关。事务可以由对一个操作完成后提交的各种数据库表的一次或多次写入组成。回滚事务,例如在操作期间出现任何错误,允许撤消所有更改。
<强>弹簧强>
最低级别Spring Transactions是用于管理对象之间的配置和依赖关系的应用程序框架。此外,它还提供了一个用于管理现代应用程序(如数据库,消息传递服务,MVC框架和事务)中使用的更高级别服务的接口。
Spring旨在用作应用程序中包含对象和服务的无所不包的主机,因此它的事务概念比hibernate关注的数据库特定事务处于更高级别。 {{3}}旨在为您提供对所有事务资源的精细控制,同时抽象出协调事务所需的经常混乱的编码。
<强> @Transactional
强>
Spring为使用事务提供了一些不同的方法 - 其中包括基于xml的方面,对API的编码和基于注释的声明性事务。基于注释的事务很方便,因为您不需要将事务管理样板代码添加到您的应用程序(即使使用PlatformTransactionManager通过API也有相当多的编码开销)。
所以@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管理代码。
答案 1 :(得分:1)
编码级别参考
春天
在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();
}
}